c++ - 在 C++ 应用程序中实现脚本

标签 c++ scripting

我想将我的应用程序的各个部分移动到简单的脚本中,让不熟悉 c++ 的人能够编辑和实现各种功能。

因为它是一个实时应用程序,所以我需要对这些脚本进行某种多任务处理。理想情况下,我希望它让 c++ 应用程序调用一个脚本函数,然后继续运行(在 c++ 线程下),直到一个暂停点(Wait(x)),或者它返回。在等待的情况下,需要保存状态,以便在持续时间到期后下次应用循环时重新启动脚本。

脚本还需要能够调用 c++ 类方法,最好使用 c++ 类,而不是围绕 c++ 类的普通包装函数。

我不想花费大量时间来实现这一点,因此使用现有的脚本语言比编写自己的脚本语言更可取。听说可以将 Python 和 Lua 集成到一个 c++ 应用程序中,但我不知道如何做到这一点。

  • 脚本必须能够调用 c++ 函数
  • 脚本必须能够在调用某些函数时“暂停”(例如等待),并由 c++ 线程重新启动
  • 需要速度快——这是针对实时应用程序,可能有很多脚本正在运行。

如果可以保存和重新启动脚本(可能通过与原始线程不同的线程),我可能可以相当轻松地滚动多任务代码。

最佳答案

您可以使用 Lua 或 Python。 Lua 比 python 更“轻量级”。它的内存占用比 python 小,并且根据我们的经验更容易集成(人们在这一点上的里程可能会有所不同)。它可以支持一堆脚本同时运行。 Lua 至少支持以您希望的方式停止/启动线程。

Boost.python 很好,但在我(有限的)经验中,我们很难为不同的环境进行编译,而且相当重量级。它有(在我看来)需要 Boost 的缺点。对于某些人来说,这可能不是问题,但如果您不需要 Boost(或不使用它),您将引入大量代码来让 Boost.python 工作。 YMMV。

我们已将 Lua 内置到多个平台(win32、Xbox360 和 PS3)上的应用程序中。我相信它可以在 x64 上运行。使用 Luabind 的建议很好。我们最终在两者之间编写了自己的接口(interface),虽然不太复杂,但拥有该胶水代码将为您节省大量时间,也许还会让您烦恼。

尽管使用任何一种解决方案,调试都可能会很痛苦。我们目前没有很好的解决方案来调试嵌入到我们应用程序中的 Lua 脚本。由于我们没有在我们的应用程序中使用 python,我无法谈论那里可能有哪些工具可用,但几年前情况大致相同——调试很差。使用脚本来扩展功能固然不错,但脚本中的错误可能会导致问题并且可能难以定位。

如果您需要在其中进行更改,Lua 代码本身就有点困惑。我们已经在 Lua 代码库本身中看到了难以追踪的错误。我怀疑 Boost::Python 可能有类似的问题。

对于任何脚本语言,它不一定是“非程序员”扩展功能的解决方案。看起来好像是这样,但您最终可能会花费大量时间来调试脚本,甚至可能是 Lua。

总而言之,我们对 Lua 非常满意,并在两场比赛中发布了它。我们目前没有放弃该语言的计划。总而言之,我们发现它比几年前可用的其他替代品更好。 Python(和 IronPython)是其他选择,但根据经验,它们似乎比 Lua 更笨重。不过,我很想听听那里的其他经历。

关于c++ - 在 C++ 应用程序中实现脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63784/

相关文章:

c++ - 继承构造函数和大括号或等于初始值设定项

c++ - 严格别名、CUdeviceptr 和 cuMemAllocManaged

c++ - ZeroMQ C++ req-rep 终止错误

c++ - 将 int 转换为 Glib::ustring w/o stringstream

linux - Grepping 文件夹名称但不包括 "@domain.com"

linux - 使用主目录 linux 创建新用户

c++ - 在 Linux 上使用 C++ 访问 Sony Playstation SixAxis Controller

linux - sed 正在匹配传递的变量子集,而不是完全匹配

c# - 在 unity 3d 中删除对象的 Box collider

javascript - 使用 WScript.shell 写入文件