考虑以下要求:
- 必须支持Windows平台, 最好也能在其他平台上运行。
- 必须支持多线程, 意味着引擎可以在多个线程中并行工作。
- 易读性很重要。
- 许可证必须与闭源项目兼容。
我喜欢Python的易读性。相比其他脚本语言,我对Python有更多的经验。然而CPython不支持多线程,IronPython需要CLR和兼容语言(如C++/CLI或C#)的支持。
考虑以下要求:
我喜欢Python的易读性。相比其他脚本语言,我对Python有更多的经验。然而CPython不支持多线程,IronPython需要CLR和兼容语言(如C++/CLI或C#)的支持。
Lua是最佳选择。Python、Ruby和JavaScript是大型语言,不适合嵌入式环境。但是,Lua不同,它专为嵌入式环境而设计。
你应该更加考虑脚本语言的限制,而不是其他方面。嵌入式脚本容易被用于恶意攻击。
例如,默认情况下,Lua不能输出到控制台。据我所知,暴雪公司就是因为这个原因使用了Lua。
我曾经也遇到过同样的困境,在Lua、Python和JScript之间进行选择。
Lua最擅长的是使用luabridge和luabind等库与C/C++代码的良好互操作性。也就是说,您可以从C++中调用Lua,并使脚本无障碍地回调到C++中,从脚本中访问C++数据以及反之。
Python和Lua这样的语言存在一个问题,那就是语言在常规意义上并不真正支持多线程:如果一个C++线程正在使用语言脚本引擎运行脚本,则无法使用相同的引擎来运行另一个脚本。这两种语言都有一个引擎级锁,可在这些情况下使用以确保维护引擎完整性。但是,这两种语言在某种程度上是多线程的,您可以在后台运行函数并与任何同步对象交互(就像从C++中一样)。因此,我选择从C++中创建所有线程,并且只在专用线程(每个引擎一个线程)中运行脚本代码,并以常规方式与应用程序中的其他线程交互。
如果您需要在C++和脚本之间传递数据和控制,Lua比Python更好。除此之外,我不会在C++项目中托管CLR,因为它太混乱了。
可以使用可嵌入的Scheme语言Guile。
JScript是一个很好的解决方案。它已经得到Windows脚本宿主的支持,并通过事件模拟多线程。相比Python,它更易于使用,我向您保证。这篇MSDN文章是一个很好的参考。
我相信Stackless Python将是唯一支持多线程的开箱即用语言。CCP选择了Stackless Python作为他们的MMO游戏Eve-Online的编程语言,主要是因为Stackless Python的代码结构允许他们在任何操作系统线程上调度继续运行,只要他们在代码中构建了必要的原语来确保整个系统的线程安全性。
Lua可以在多线程环境下使用,但每个并发线程都需要一个单独的lua_State对象,因此您需要构建自己的线程间消息传递系统,以便在不同的Lua状态下执行的Lua代码进行通信。
完全基于个人喜好。大多数编程语言都有一种嵌入C的方式,并提供将其导出到脚本环境的选项。
如果是我,我会选择V8 JavaScript。