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

17

考虑以下要求:

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

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


1
嗯,它确实是多线程的。但是,如果你想使用线程来实现并发,那么CPython就不是正确的选择了。但是,当嵌入时,这真的是一个问题吗?你能详细说明一下用例吗? - Lennart Regebro
我有几个工作线程和一个UI线程,这些工作线程和UI线程都将使用C++编写的部分,但尽可能多的代码应该是可扩展和可修改的,而无需重新编译。 - John
从我所了解的来看,stackless使用协作调度,这意味着它的微线程类似于纤程。我在多线程方面的目标是同时利用多个CPU核心。 - John
听起来更像是你想在脚本语言中嵌入C/C++。 :) - Lennart Regebro
1
Javascript 不支持线程... - Endophage
显示剩余2条评论
12个回答

29

1
此外,LUA 是专门设计用于应用程序脚本编写的,目前已有大量性能优化、多线程、图形密集型 C++ 应用程序(即“视频游戏”)使用 LUA 进行用户脚本编写。同时,您可以选择将哪些部分暴露给脚本编写方面使用。 - foo
协程不是并发运行的。 - John
Lua可以通过对所有对lua_State对象的访问进行序列化以线程安全的方式使用。这意味着协同程序实际上无论如何都是单线程的。 - Chris Becke
Lua的简单语法使得它比Ruby(或者我猜想的Python)写起来不那么令人愉悦,但是却非常易于阅读。 - Phrogz
2
请查看 Lua Lanes:http://luaforge.net/projects/lanes/ 以进行多核线程处理。 - sworoc
Lua不支持多线程。多线程是通过使用相同的内存空间来定义的。而将所有对lua_State的访问序列化的性能建议只是一个笑话。它会将性能降低到原来的1/10到1/50。这只是一个理论测试。 - Lothar

12

Lua是最佳选择。Python、Ruby和JavaScript是大型语言,不适合嵌入式环境。但是,Lua不同,它专为嵌入式环境而设计。

你应该更加考虑脚本语言的限制,而不是其他方面。嵌入式脚本容易被用于恶意攻击。

例如,默认情况下,Lua不能输出到控制台。据我所知,暴雪公司就是因为这个原因使用了Lua。


例如,默认情况下,Lua 无法打印到控制台。但是,您可以通过将它们设置为 nil 或在初始化代码中根本不加载包含库来轻松避免不需要的函数。 - jpjacobs
我的意思是,那不是真的:Lua默认可以打印到控制台。 - jpjacobs
4
我同意Lua是一个不错的选择,但Python和JavaScript都被设计成可嵌入的。Python的设计也适用于作为独立语言使用,但从一开始就非常适合嵌入式设计。JavaScript从第一天起就被嵌入在Web浏览器中;独立的JavaScript是近年才出现的产物。 - Michael Ekstrand

11

我曾经也遇到过同样的困境,在Lua、Python和JScript之间进行选择。

Lua最擅长的是使用luabridge和luabind等库与C/C++代码的良好互操作性。也就是说,您可以从C++中调用Lua,并使脚本无障碍地回调到C++中,从脚本中访问C++数据以及反之。

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

如果您需要在C++和脚本之间传递数据和控制,Lua比Python更好。除此之外,我不会在C++项目中托管CLR,因为它太混乱了。


9
您可以考虑嵌入一个流行的JavaScript引擎。它们不仅快速且得到良好支持,而且许多人都知道如何用JavaScript编程,因此很容易被广泛采用和阅读。
根据这个答案SpiderMonkey引擎是线程安全的,而Google/Chrome的V8可能不是。

同意...此外,将脚本作为“工作者”运行可能也是更好的选择。SpiderMonkey还有E4X的优势。虽然V8拥有CommonJS和许多快速增长的库,但可能不适用于moz嵌入式。 - Tracker1
+1,JavaScript非常流行,而且速度很快! - arthurprs

4

可以使用可嵌入的Scheme语言Guile


1
不符合要求。我认为Lisp不是一种易读的语言。而GPL与闭源项目不兼容。 - John
它是LGPL协议,完全兼容闭源项目。 - Thomas
1
我认为Lisp是一种易读的语言。现在怎么样?;-) - Thomas
由于Guile是虚拟机,除了Scheme之外,它还支持其他语言。我相信ECMAscript是唯一受官方支持的语言,但也有一个git分支支持Lua。 - Andreas Raster

4

JScript是一个很好的解决方案。它已经得到Windows脚本宿主的支持,并通过事件模拟多线程。相比Python,它更易于使用,我向您保证。这篇MSDN文章是一个很好的参考。


2
Lua非常容易集成,可以使用类似于Lua Lanes的东西在多个线程中工作(这是跨平台的Windows/Linux/MacOS)。

1

我相信Stackless Python将是唯一支持多线程的开箱即用语言。CCP选择了Stackless Python作为他们的MMO游戏Eve-Online的编程语言,主要是因为Stackless Python的代码结构允许他们在任何操作系统线程上调度继续运行,只要他们在代码中构建了必要的原语来确保整个系统的线程安全性。

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


1

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接