任何将Clang作为脚本解释器嵌入到C++代码中的教程?

FFo*_*Fox 16 c++ jit llvm clang embedded-language

我没有llvm或clang的经验.据我所知,clang被认为很容易嵌入维基百科 -但是,我没有找到任何有关如何实现这一目标的教程.那么有可能通过JIT在运行时编译和执行用户定义的代码来为c ++应用程序的用户提供脚本功能吗?是否可以调用应用程序自己的类和方法并共享对象?

编辑:我更喜欢脚本语言的C语法(甚至C++本身)

Eva*_*haw 13

我不知道任何教程,但是在Clang源代码中有一个示例C解释器可能会有所帮助.你可以在这里找到它:http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/

如果你走这条路线,你可能不会为脚本语言选择多少语法.Clang只解析C,C++和Objective C.如果你想要任何变化,你可能会为你裁掉你的工作.

  • 好的,这就是我所做的:http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-July/009836.html ...它实际上是在cfe的好人的帮助下解决的-dev邮件列表.为什么你认为这个解释器不能在应用程序中使用? (2认同)

Eon*_*nil 7

我想这就是你所描述的.

http://root.cern.ch/drupal/content/cling


小智 6

您可以使用clang作为库来实现其他答案所述的JIT编译.然后,您必须加载已编译的模块(例如,.so库).

为了实现这一点,你可以使用标准的dlopen(unix)或LoadLibrary(windows)加载它,然后使用dlsym(unix)动态引用编译的函数,比如说一个"script"main() - 就像名字已知的函数一样.请注意,对于C++,您必须使用损坏的符号.便携式替代品是例如GNU的libltdl.

作为替代方案,"脚本"可以通过实现模块初始化函数或放置一些静态代码在加载时自动运行(将立即调用C++全局定义对象的构造函数).

加载的模块可以直接调用主应用程序中的任何内容.当然,编译时通过使用正确的主应用程序的头文件来识别符号.

如果你想轻松地将C++"插件"添加到你的程序中,并且先验地知道组件接口(比如你的主应用程序在模块加载到内存之前就知道从.h加载的类的名称和接口),在你之后动态加载库,可以使用该类,就像它是静态链接一样.确保在dlopen()模块之前不要尝试实例化一个类'对象.

使用静态代码也可以实现良好的自动插件注册机制.