我对 LLVM 或 Clang 没有任何经验。根据我所了解的信息,Clang 被称为易于嵌入维基百科-Clang,但是我没有找到任何关于如何实现这一点的教程。因此,在运行时通过 JIT 编译和执行用户定义的代码,是否可以为 C++ 应用程序的用户提供脚本功能?是否可以调用应用程序自己的类和方法并共享对象?
编辑:我希望脚本语言使用类似 C 的语法(甚至是 C++ 本身)。
我对 LLVM 或 Clang 没有任何经验。根据我所了解的信息,Clang 被称为易于嵌入维基百科-Clang,但是我没有找到任何关于如何实现这一点的教程。因此,在运行时通过 JIT 编译和执行用户定义的代码,是否可以为 C++ 应用程序的用户提供脚本功能?是否可以调用应用程序自己的类和方法并共享对象?
编辑:我希望脚本语言使用类似 C 的语法(甚至是 C++ 本身)。
我不知道有没有相关教程,但Clang源代码中有一个示例C解释器可能会有所帮助。您可以在这里找到: http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/
如果您选择这种方法,您的脚本语言的语法可能并不多样化。Clang只解析C、C++和Objective C。如果您想要任何变化,那么您可能需要付出更多努力。
我不知道Clang,但你可能想看看Ch:
http://www.softintegration.com/
这被描述为可嵌入或独立的C/C++解释器。这里有一篇Dr. Dobbs文章,其中包含嵌入它的示例:
http://www.drdobbs.com/architecture-and-design/212201774
我只是玩了一下,但它似乎是一个稳定和成熟的产品。它是商业闭源的,但“标准”版本被描述为个人和商业使用免费。然而,查看许可证时,似乎“商业”可能仅包括内部公司使用,而不是嵌入到随后出售或分发的产品中。(我不是律师,因此显然应该与SoftIntegration核实许可证条款。)
我不确定在你的情况下嵌入类似Clang的C或C++编译器是否是一个好主意。因为“脚本”,也就是(在运行时!)输入的(C或C++)代码可以是任意的,所以有可能会导致整个应用程序崩溃。通常情况下,您不希望错误的用户输入能够使应用程序崩溃。
一定要阅读每个C程序员都应该知道的未定义行为,因为它与C++相关,并适用于您的应用程序使用的任何“C++脚本”。请注意,不幸的是,许多未定义行为不会使进程崩溃(例如缓冲区溢出可能会破坏一些完全无关的数据)。
如果您想嵌入一个解释器,请选择专门为此目的设计的工具,例如Guile或Lua,并注意脚本中的错误不会导致整个应用程序崩溃。请参阅this answer以获取有关解释器嵌入的更详细讨论。
SIGSEGV
会中止整个进程。 - Basile Starynkevitch