【发布时间】: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 通常是的。但问题是每个要序列化的元素实际上都是函数,而不是一些具有具体值的对象。
-
很公平。根据操作的复杂性,也许您可以创建一个简单的领域特定语言并生成/解析它,作为另一个想法。