4

我正在研究如何最好地扩展具有脚本功能的 C++ 应用程序,我正在研究 Python 或 JavaScript。用户定义的脚本需要能够访问应用程序的数据模型。

你们有没有嵌入这些脚本引擎的经验?有哪些潜在的陷阱?

4

5 回答 5

7

Lua 也是嵌入程序的绝佳候选者。它非常独立,甚至原生的跨语言调用系统也不错。

对于 JavaScript,您现在最好的选择是查看 V8(来自 Google),它很容易使用。

于 2010-05-25T18:02:22.643 回答
6

使用Boost::Python库嵌入 Python 肯定很容易(好吧,好吧,讽刺)。就跨语言功能而言,没有什么是“容易”的。Boost 在帮助这种发展方面做了很多工作。我合作过的一位开发人员对 Boost->Python 界面发誓。用户可以使用 Python 编写他的代码,并在 UI 中内置 REPL。惊人的。

但是,使用 SWIG 和 Java 等其他语言可以更好地观察我的经验。我目前正在与 SWIG 合作,用 Python 包装 C++。有各种各样的陷阱,包括异常、线程、跨语言多态等等。

我先看看这两个地方。正如我所说,没有什么是“容易的”,但这两者都让生活更宜居。

于 2010-05-25T17:50:57.737 回答
4

除非您真的使用 Python 或 Javascript,否则我会考虑使用Lua。由于它完全是作为嵌入式脚本引擎设计的,因此它消除了与 C 和 C++ 已经做得很好的部分重叠。只要您仅在代码和 Lua 引擎之间就 C 可调用函数进行接口,它也很容易嵌入。

如果你想使用 C++ 级别的接口,你可能想看看LuaBind,它允许 Lua 类从(它生成的代理)你编写的 C++ 类派生。

于 2010-05-25T18:07:01.013 回答
1

Boost::Python,正如小麦的回答一样,是一个非常成熟的解决方案。

Lua 以易于嵌入而闻名,但我自己没有尝试过。

作为R的用户,我对嵌入R更感兴趣,这可以使用RInside包。一个简单的例子是

#include <RInside.h>                // for the embedded R via RInside

int main(int argc, char *argv[]) {

    RInside R(argc, argv);          // create an embedded R instance 

    R["txt"] = "Hello, world!\n";   // assign a char* (string) to 'txt'

    R.parseEvalQ("cat(txt)");       // eval the init string, ignoring any returns

    exit(0);
}

包中还有更多示例。 RInside本质上使用一些Rcpp接口包为您提供了一个很好的 R 引擎包装器。

于 2010-05-25T18:00:58.927 回答
1

看看 angelscript 简单易嵌入,类似 c/c++ 的语法。免费和跨平台。你可以在几个小时内开始。

于 2011-02-22T15:30:26.097 回答