【问题标题】:Compile a C++ function inside a C++ program在 C++ 程序中编译 C++ 函数
【发布时间】:2017-10-01 17:11:12
【问题描述】:

考虑以下问题,

C++ 程序可能会发出 C++ 函数的源代码,例如,它会创建一个内容如下的字符串:

std::vector<std::shared_ptr<C>> get_ptr_vec()
{
    std::vector<std::shared_ptr<C>> vec;
    vec.push_back(std::shared_ptr<C>(new C(val1)));
    vec.push_back(std::shared_ptr<C>(new C(val2)));
    vec.push_back(std::shared_ptr<C>(new C(val3)));
    vec.push_back(std::shared_ptr<C>(new C(val4)));
    return vec;
}

val1 等的值将在程序创建上述源字符串时在运行时确定。这个源将被写入一个文件,比如get_ptr_vec.cpp

然后另一个C++程序需要读取这个源文件,编译它,调用get_ptr_vec函数并获取它返回的对象。有点像 JIT 编译器。

有什么办法可以做到吗?我认为一种解决方法是使用一个脚本来编译文件,将其构建到共享库中。第二个程序可以通过dlopen获取该功能。但是,无论如何都可以跳过这个并让第二个程序编译文件(不调用system)。请注意,第二个程序在编译时将无法看到此源文件。事实上,第一个程序可能会发出数千个这样的小源文件。

为了提供一点背景知识,第一个程序将构建一个表达式树,并通过遍历后序来序列化树。树的每个节点都会有一个字符串表示写入文件。第二个程序将读取这个序列化树节点的列表,并且需要能够将这个字符串列表重构为一个 C++ 对象列表(稍后我可以从这个列表中重构树)。

我认为 LLVM 框架可能在这里提供一些东西。有人可以给我一些指示吗?不需要完整的答案,我可以从某个地方开始。

【问题讨论】:

  • 这非常接近 - 应该关闭:"要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack 来说是题外话溢出,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决问题所做的工作。”
  • 是的,我们一般不这样做。我们可能会从 Python 脚本甚至是 C++ 程序生成 C++,但结果总是会通过管道传递给适当的编译器。
  • 为此使用某种序列化库不是更有意义吗? Boost::Serialization 可能吗?
  • @KarlReid 通常是的。但问题是每个要序列化的元素实际上都是函数,而不是一些具有具体值的对象。
  • 很公平。根据操作的复杂性,也许您可​​以创建一个简单的领域特定语言并生成/解析它,作为另一个想法。

标签: c++ llvm jit


【解决方案1】:

您可以使用 clang 编译生成的代码并发出 LLVM 位码(-emit-llvm 标志)。然后,将您的程序与读取位码文件并 JIT 的 LLVM 部分静态链接。最后,获取已编译的 bitcode 并在它们上运行 JIT,这样它们就可以在您的程序的地址空间中使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多