哪种脚本语言更适合嵌入多线程C / C ++应用程序

时间:2011-01-21 07:51:36

标签: javascript python ruby windows lua

考虑以下要求:

  • 必须在Windows上受支持。最好也适用于其他平台。
  • 必须支持多线程。我的意思是引擎可以在多个线程中并行工作。
  • 可读性很重要。
  • 许可证必须与闭源项目兼容。

我喜欢Python的可读性。我对Python的经验也比其他脚本语言更多。但是CPython不是多线程的,IronPython需要托管CLR和兼容的语言(C ++ / CLI或C#)。

12 个答案:

答案 0 :(得分:29)

Lua可能值得一试。它可以在thread-safe manner中使用,并且该语言支持符合您要求的'co-routine'概念。

答案 1 :(得分:12)

Lua是最好的选择。 Python,Ruby和JavaScript都是大语言,它们不是为嵌入而设计的。但Lua与众不同,旨在嵌入。

你应该考虑"限制"比你的脚本语言更多的东西。嵌入脚本可以轻松地用于破解(错误的意思)。

例如,默认情况下Lua无法打印到控制台。据我所知,暴雪因此使用了Lua。

答案 2 :(得分:11)

我在选择Lua而不是Python和JScript时遇到了同样的困境。 Lua最擅长的是使用像luabridge和luabind这样的库的C / C ++代码。也就是说,你可以从C ++调用lua并让脚本回调到C ++而没有问题,从脚本中访问c ++数据,反之亦然。

Python和Lua等语言的问题在于,语言在常规意义上并非真正多线程:如果一个C ++线程使用语言脚本引擎来运行脚本,你不能使用相同的引擎来运行另一个脚本。两种语言都有一个引擎范围的锁,可以在这些情况下使用,以确保维持引擎的完整性。但是,这两种语言都是多线程的,因为您可以在后台运行函数并与您想要的任何同步对象进行交互(就像从C ++中那样)。所以我选择从C ++和脚本代码创建的所有线程只在专用线程(每个引擎的线程)中运行,并以常规方式与应用程序中的其他线程交互。

如果你需要将数据和控制从C ++传递到脚本,反之亦然,Lua要比Python好得多。除此之外,我不会在C ++项目中托管CLR。太乱了。

答案 3 :(得分:9)

您可以考虑嵌入一个流行的JavaScript引擎。它们不仅速度快,而且支持得很好,但是很多人都知道如何使用JavaScript进行编程,以便大量的观众轻松采用和阅读。

根据this answerSpiderMonkey engine是线程安全的,而Google/Chrome's V8可能不是。

答案 4 :(得分:4)

JScript是一个很好的解决方案。 Windows脚本宿主已经支持它,并使用事件模拟多线程。我保证,它比Python更容易使用。 This MSDN article是一个很好的参考。

答案 5 :(得分:4)

可以使用Guile,这是可嵌入的Scheme。

答案 6 :(得分:2)

Lua非常容易集成,并且可以使用Lua Lanes(跨平台的Windows / Linux / MacOS)等多线程工作。

答案 7 :(得分:1)

我非常确定Stackless Python将成为唯一一个支持多线程开箱即用的人。 CCP为他们的MMO选择了Stackless Python:Eve-Online特别是因为代码的无堆栈特性允许他们在构建必要的原语以使整个事物线程安全时,在他们需要的任何OS线程上安排延续。

Lua可以在多线程环境中使用,但是每个并发线程都需要一个单独的lua_State对象,所以你需要为lua代码构建自己的线程传递消息传递系统,在单独的lua状态的上下文中执行,通信。

答案 8 :(得分:1)

你可以试试spidermonkey。查看基于Libjspp C ++模板的包装器,用于嵌入和扩展Javascript引擎spidermonkey: http://code.google.com/p/libjspp/

答案 9 :(得分:0)

完全基于偏好。大多数语言都有一种嵌入C语言的方法,可以选择导出到脚本环境中。

如果是我,我会使用V8 Javascript。

答案 10 :(得分:0)

通过“多线程”我假设你的意思是“可以有效地利用多核”?如果您的系统只有一个CPU,那么无论您选择哪种脚本语言,您一次只能完成一件事。

如果你决定采用CPython路由,那么要记住的主要事情是它只是脚本引擎本身受全局解释器锁保护。如果正在执行的脚本花费大量时间调用非Python代码(包括I / O和其他系统级操作),那么它可以非常愉快地利用多个线程。

另一个需要考虑的因素是Python的内省功能使得它本身难以正确保护(谷歌已经为AppEngine做了这件事,但他们不得不在此过程中不允许这样做。)

鉴于PC游戏中浏览器和Lua引擎中Javascript引擎的普及,其中一种可能是更容易的前进方式。

答案 11 :(得分:0)

尝试使用Falcon编程语言