我想将我的应用程序的各个部分移动到简单的脚本中,以使那些不了解c++的人能够编辑和实现各种功能。
因为它是一个实时应用程序,所以我需要对这些脚本进行某种多任务处理。理想情况下,我想要它,以便c++应用程序调用脚本函数,然后该脚本函数继续运行(在c++线程下),直到暂停点(Wait(x))或返回为止。在等待的情况下,需要保存状态,以便在持续时间到期后下次应用程序下次循环时重新启动脚本。
脚本还需要能够调用c++类方法,理想情况下使用c++类,而不是围绕c++类的普通包装函数。
我不想花费大量时间来实现这一点,因此使用现有的脚本语言比编写我自己的脚本语言更可取。我听说Python和Lua可以集成到c++应用程序中,但是我不知道如何实现我的目标。
我可以很容易地滚动多任务代码,前提是可以保存并重新启动脚本(可能是通过与原始脚本不同的线程)。
最佳答案
您可以使用Lua或Python。 Lua比python更“轻巧”。与python相比,它的内存占用空间更小,并且根据我们的经验,它更易于集成(人们在这一点上的努力可能会有所不同)。它可以支持一堆同时运行的脚本。至少,Lua支持以您期望的方式停止/启动线程。
Boost.python很不错,但是根据我的经验(有限),我们很难为我们的不同环境进行编译,而且重量很大。 (在我看来)它具有需要Boost的缺点。对于某些人来说,这可能不是问题,但是如果您不需要Boost(或不使用它),则需要引入大量代码来使Boost.python正常工作。 YMMV。
我们已经将Lua内置到多个平台(win32,Xbox360和PS3)上的应用程序中。我相信它将在x64上运行。使用Luabind的建议很好。我们结束了在这两者之间编写自己的界面的工作,虽然并不太复杂,但是拥有该粘合代码将为您节省大量时间,甚至可以节省很多时间。
无论采用哪种解决方案,调试都可能很麻烦。当前,我们尚无调试嵌入到我们应用程序中的Lua脚本的好的解决方案。由于我们没有在应用程序中使用python,所以我无法说说那里可能提供哪些工具,但是几年前情况大致相同-调试不佳。使用脚本来扩展功能是很好的,但是脚本中的错误可能会导致问题,并且可能难以定位。
如果您需要在其中进行更改,那么Lua代码本身就很麻烦。我们已经看到Lua代码库本身中的错误很难找到。我怀疑Boost::Python可能有类似的问题。
对于任何脚本语言,它不一定是“非程序员”扩展功能的解决方案。看起来似乎很不错,但是您可能会花大量的时间调试脚本甚至使用Lua。
综上所述,我们对Lua感到非常满意,并在两场比赛中将其交付。我们目前没有计划放弃使用该语言。总而言之,我们发现它比几年前提供的其他替代产品更好。 Python(和IronPython)是其他选择,但根据经验,它们似乎比Lua更为繁重。我很想听听那里的其他经历。