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

考虑以下要求:

  • 必须支持Windows。最好也能在其他平台上工作。
  • 必须支持多线程。这意味着引擎可以在多个线程中并行工作。
  • 可读性很重要。
  • 许可证必须与闭源项目兼容。

我喜欢Python的可读性。我也比其他脚本语言更有经验地使用Python。然而,CPython不支持多线程,而IronPython需要托管CLR和兼容的语言(C++ / CLI或C#)。

原文链接 https://stackoverflow.com/questions/4756544

点赞
stackoverflow用户88888888
stackoverflow用户88888888

JScript是一个很好的解决方案。它已经被Windows脚本主机支持,并使用事件模拟了多线程。我向你保证,它比Python更容易使用。这篇MSDN文章是一个很好的参考。

2011-01-21 07:55:19
stackoverflow用户6521
stackoverflow用户6521

Lua 可能值得一试。它可以以线程安全的方式使用,并且语言支持 '协同程序' 概念,这可能符合您的要求。

2011-01-21 08:07:40
stackoverflow用户194106
stackoverflow用户194106

我之前也面临过这个选择,最终选择了Lua而不是Python和JScript。

Lua最擅长的一点是与C/C++代码的极佳互操作性,使用诸如luabridge和luabind这样的库。也就是说,您可以从C++中调用lua,并在脚本中回调到C++,从脚本访问C++数据,反之亦然。

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

如果您需要从C++传递数据和控制到脚本以及反之,则Lua比Python更好。此外,我不会在C++项目中托管CLR。这太混乱了。

2011-01-22 17:52:17
stackoverflow用户27491
stackoverflow用户27491

我很确定 Stackless Python 将成为支持多线程的唯一选择。CCP 选择使用 Stackless Python 来支持他们的 MMO 游戏:Eve-Online,主要是因为代码的无栈特性使他们能够在任何他们需要的操作系统线程上调度连续性,一旦他们建立了必要的原语来保证整个线程的安全性。

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

2011-01-23 13:20:53
stackoverflow用户591083
stackoverflow用户591083

Lua 是最好的选择。Python、Ruby 和 JavaScript 是大型语言,不适合嵌入其他程序中。但 Lua 不同,它是为嵌入而设计的。

你应该更加考虑你的脚本语言对“限制”的支持,而非其他方面的支持。易于嵌入的脚本语言通常都容易用于恶意攻击。

例如,Lua 默认是无法向控制台打印输出的。我所知道的,暴雪公司就是因为这一点而选择了 Lua。

2011-01-26 18:47:08
stackoverflow用户405017
stackoverflow用户405017

你可以考虑嵌入一个流行的 JavaScript 引擎。它们不仅快速且得到良好的支持,而且很多人都知道如何编程 JavaScript,因此它将被大多数人轻松采用和阅读。

根据这个回答SpiderMonkey 引擎 是线程安全的,而Google/Chrome 的 V8可能不是。

2011-01-29 17:15:02
stackoverflow用户513763
stackoverflow用户513763

Lua非常容易集成,并且可以使用像[Lua Lanes](http://kotisivu.dnainternet.net/askok/bin/lanes/)这样的多线程来工作(它是跨平台的Windows / Linux / MacOS)。

2011-01-30 20:26:35
stackoverflow用户596087
stackoverflow用户596087

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

2011-01-30 21:37:28
stackoverflow用户353872
stackoverflow用户353872

完全基于偏好。大多数编程语言都有一种将其嵌入到 C 中的方式,并提供将其导出到脚本环境的选项。

如果是我,我会选择 V8 Javascript。

2011-01-31 19:33:43
stackoverflow用户597742
stackoverflow用户597742

若你所指的"multithreaded"指的是"能有效利用多核心",那么即使选择任何一种脚本语言,如果你的系统仅有一颗处理器,就只能同时进行一项任务。

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

另一个要考虑的因素是,Python的内省能力使它固有地难以被妥善保护(虽然谷歌已经为AppEngine解决了这个问题,但在此过程中必须禁止许多东西)。

考虑到浏览器中广泛使用的Javascript引擎和PC游戏中常用的Lua引擎,它们中的一个可能是更容易前进的方法。

2011-02-01 04:59:46
stackoverflow用户1398252
stackoverflow用户1398252

尝试使用Falcon编程语言。

2012-05-16 09:33:24
stackoverflow用户1807864
stackoverflow用户1807864

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

2012-11-08 01:18:14