我没有llvm或clang的经验。据我所知,clang被认为是易于嵌入的Wikipedia-Clang,但是,我没有找到任何有关如何实现这一目标的教程。那么有可能通过JIT在运行时编译和执行用户定义的代码来为c ++应用程序的用户提供脚本功能吗?是否可以调用应用程序自己的类和方法并共享对象?
编辑:我更喜欢脚本语言(甚至是C ++本身)的类C语法
答案 0 :(得分:12)
我不知道任何教程,但是在Clang源代码中有一个示例C解释器可能会有所帮助。您可以在此处找到它:http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/
如果你走这条路,你可能不会为脚本语言选择多少语法。 Clang只解析C,C ++和Objective C.如果你想要任何变化,你可能会为你裁掉你的工作。
答案 1 :(得分:7)
我想这就是你所描述的。
答案 2 :(得分:6)
您可以使用clang作为库来实现其他答案所述的JIT编译。 然后,您必须加载已编译的模块(例如,.so库)。
为了实现这一点,你可以使用标准的dlopen(unix)或LoadLibrary(windows)加载它,然后使用dlsym(unix)动态引用编译的函数,比如说一个“script”main() - 就像名字已知。请注意,对于C ++,您必须使用损坏的符号。 便携式替代品例如是GNU的libltdl。
作为替代方案,“脚本”可以在加载时自动运行,方法是实现模块初始化函数或放置一些静态代码(将立即调用C ++全局定义对象的构造函数)。
加载的模块可以直接调用主应用程序中的任何内容。当然,编译时通过使用正确的主应用程序的头文件来识别符号。
如果你想轻松地将C ++“插件”添加到你的程序中,并且先验地知道组件接口(假设你的主应用程序在模块加载到内存之前就从.h知道加载类的名称和接口) ,在动态加载库之后,可以使用该类,就像它是静态链接一样。确保在dlopen()模块之前不要尝试实例化一个类'对象。
使用静态代码也可以实现良好的自动插件注册机制。
答案 3 :(得分:0)
我不知道Clang,但你可能想看看Ch:
http://www.softintegration.com/
这被描述为可嵌入或独立的c / c ++解释器。有一篇Dobbs博士的文章,其中包含了嵌入它的例子:
http://www.drdobbs.com/architecture-and-design/212201774
我做的不仅仅是玩它,但它似乎是一个稳定和成熟的产品。它是商业的,闭源的,但“标准”版本被描述为免费用于个人和商业用途。但是,查看许可证似乎“商业”可能只包括公司内部使用,而不是嵌入随后出售或分发的产品中。 (我不是律师,所以很明显应该与SoftIntegration一起确认许可条款。)
答案 4 :(得分:0)
我不确定在您的情况下嵌入像Clang这样的C或C ++编译器是个好主意。因为"脚本",即(C或C ++)代码(在运行时!)可以是任意的,因此能够使整个应用程序崩溃。您通常不希望错误的用户输入能够使您的应用程序崩溃。
如果您想要嵌入口译员,请选择为此目的设计的内容,例如Guile或Lua,并注意脚本中的错误不会导致整个应用程序崩溃。有关解释器嵌入的更详细讨论,请参阅this answer。