2010-07-11 16 views
14

我还没有使用llvm或clang的经验。据我所知,铛被认为很容易嵌入Wikipedia-Clang,但是,我没有找到任何关于如何实现这一目的的教程。那么是否有可能通过JIT在运行时编译和执行用户定义的代码来为C++应用程序的用户提供脚本功能?是否有可能调用应用程序自己的类和方法并共享对象?将Clang作为脚本解释器嵌入到C++代码中的任何教程?

编辑:我宁愿为脚本languge类似C语言的语法(甚至C++本身)

回答

10

我不知道任何教程,但在锵源的例子C解释这可能会有所帮助。你可以在这里找到它:http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/

你可能不会有太大的语法的首选脚本语言,如果你走这条路线。 Clang只分析C,C++和Objective C.如果你想要任何变化,你可能会为你裁剪你的工作。

+0

谢谢。我花了相当长的一段时间才将它启动并运行 - 基本上是因为我没有找到可执行文件:)现在看了它之后,我会说它已经是中途了。现在我需要弄清楚如何调用在非接口部分定义的函数。 ...有关于此的任何想法? – FFox 2010-07-13 20:03:01

+0

我不确定你的意思。您应该能够获得指向您编译的任何函数的指针。也许这个通用的LLVM教程会很有帮助:http://llvm.org/docs/tutorial/(特别是第4章)。我不认为你可以像现在这样使用这个解释器,但它应该让你知道如何在你的应用程序中嵌入一个C/C++解释器。 (我甚至没有用过它;我只记得看到它。) – 2010-07-13 20:37:01

+1

好吧,这是我做的:http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-July/009836.html ......它实际上是在cfe-dev邮件列表中的好人帮助下完成的。 你为什么认为这个解释器不能用在应用程序中? – FFox 2010-07-14 05:51:21

5

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

为了达到这个目的,你可以使用标准的dlopen(unix)或LoadLibrary(windows)来加载它,然后使用dlsym(unix)来动态引用编译函数,比如说一个“脚本”main()函数其名称是已知的。请注意,对于C++,您将不得不使用损坏的符号。便携式替代品是例如GNU的libltdl

作为替代,“脚本”可以自动地在加载时通​​过实现模块初始化函数或把一些静态代码(一个C++全局定义的对象将被立即调用的构造函数)运行。

加载的模块可以直接调用在主应用程序什么。当然,通过使用适当的主应用程序的头文件,编译时已知符号。

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

使用静态代码允许实现很好的自动插件注册机制了。

0

我不知道嵌入C或C++编译器像Clang你的情况是个好主意。由于“脚本”(即运行时提供的(C或C++)代码)可以是任意的,因此可以使整个应用程序崩溃。您通常不希望错误的用户输入能够使您的应用程序崩溃。

如果您想嵌入解释器,请选择专门为此目的设计的东西,如GuileLua,并且要小心脚本中的错误不会使整个应用程序崩溃。有关解释器嵌入的更详细的讨论,请参阅this answer