12

我面临着使 C++ 应用程序可由用户编写脚本的任务。该应用程序已经开发了好几年,以前没有人在这方面浪费过任何想法。它包含各种细节,如多线程、模板巫术和多重继承。作为脚本语言,Python 是首选,但如果 Lua 更容易实现,则可能会被接受。

问题 1

从我目前所了解到的情况来看,大致有两种方法可以将 Python/Lua 与 C++ 集成:“扩展”和“嵌入”。

在这种情况下,看起来我需要两者。脚本语言需要访问应用程序中的对象、方法和数据,但需要在用户编写脚本后由应用程序调用 - 无需重新启动任何内容。

这在现实世界中通常是如何完成的?

问题2

那里似乎有一系列令人眼花缭乱的手动解决方案和绑定生成器,所有这些都不够完美。

  • swig,pyste,Py++,ctypes,Boost.Python sip,PyCXX,pybindgen,robin,(Cython/Pyrex,Weave)
  • CppLua、Diluculum、Luabind、Luabridge、LuaCpp、Luna/LunaWrapper、MLuaBind、MultiScript、OOLua、SLB、Sweet Lua、lux(此列表来自 lua wiki)
  • CPB、tolua、tolua++、toLuaxx、luna 和再次痛饮

在网上找到的大多数评论都有些过时了。例如,据说 swig 在非平凡的情况下很困难,并且会生成难以理解的代码。OTOH,它最近已经升级到 v2.0。

上面一些使用 pygccxml 让 gcc 分析 C++ 代码然后生成绑定。我觉得这个想法很有吸引力,因为 gcc 可能比我更了解代码:-)。这行得通吗?

对它们全部进行测试可能很容易花费我为整个项目分配的一半时间。

那么,你推荐哪些?

4

5 回答 5

12

我不推荐 swig,因为它很难在复杂的情况下产生令人满意的绑定:去过那里,做到了。我不得不编写一个可怕的脚本来“解析”原始 C++ 代码以生成一些可接受的 C++ 代码,这些代码可以让 swig 咀嚼并生成可接受的绑定。所以,一般来说:避免任何依赖于解析原始 C++ 程序的解决方案。

Lua 和 Python 之间:我发现 Lua 很多,更好的文档和更干净的实现。例如,Python 有一个 GIL(全局锁),而使用 Lua,您可以在每个线程中拥有一个解释器实例。所以,如果你可以选择,我会推荐 Lua。它是更小的语言,更容易理解,更容易嵌入(更简洁和更小的 API,具有出色的文档)。我在我的一个小项目中使用了 luabind,发现它很容易使用。

于 2010-07-21T12:29:09.593 回答
1

关于问题 1 - 是的,你需要两者都做。

您会将您的应用程序脚本接口暴露给嵌入式解释器,然后该解释器运行有问题的用户脚本。

关于嵌入的 Python 手册部分包括扩展嵌入式 Python部分,并且有 Lua 的类似内容的教程,请参见例如这篇文章。当然,当您决定使用哪种脚本语言和绑定机制时,可能会找到更简单的方法。

于 2010-07-21T12:51:40.600 回答
1

上面一些使用 pygccxml 让 gcc 分析 C++ 代码然后生成绑定。我觉得这个想法很有吸引力,因为 gcc 可能比我更了解代码:-)。这行得通吗?

Lua Qt binding - lqt中使用了类似的方法。它用于cpptoxml生成一个包含所有带参数的类和方法的 XML 文件,并据此生成绑定 C++ 代码。

它工作得非常好,生成器能够绑定几乎所有的 Qt 类和方法,包括虚拟方法、重载运算符、选定的模板类、信号/槽机制等。

虽然它是专门为 Qt 创建的,但它有一个“noqt”模式,在这种模式下它可以用作通用绑定器,不幸的是我没有使用它的经验,所以我不知道绑定你的代码需要做多少工作。

于 2010-07-21T14:53:53.503 回答
0

我的经验可能不多,但我认为至少值得您为此付出的代价;)

我已经完成了一些基本的“hello world”python 模块,但我无法真正进入 swig - 我正在做的事情似乎有很多开销。当然,它也有可能只是您需要的适量。

于 2010-07-21T12:30:40.197 回答
0

试试 Boost::Python,它有一些与之相关的学习曲线,但在我看来,它是完成这项工作的最佳工具,我们有一个巨大的实时系统,并为 Boost::Python 中的 QA 开发了脚本库。

于 2010-07-21T12:55:10.337 回答