哪种脚本语言更适合嵌入多线程 C/C++ 应用程序 [关闭]
Posted
技术标签:
【中文标题】哪种脚本语言更适合嵌入多线程 C/C++ 应用程序 [关闭]【英文标题】:Which scripting language is better for embedding in multi-threaded C/C++ application [closed] 【发布时间】:2011-06-12 23:53:02 【问题描述】:考虑以下要求:
必须在 Windows 上受支持。最好也适用于其他平台。 必须支持多线程。我的意思是引擎可以在多个线程中并行工作。 可读性很重要。 许可证必须与闭源项目兼容。我喜欢 Python 的可读性。我也比其他脚本语言有更多的 Python 经验。但是 CPython 不是多线程的,IronPython 需要托管 CLR 和兼容的语言(C++/CLI 或 C#)。
【问题讨论】:
嗯,它是多线程的。但是,是的,如果您想使用线程进行并发,那么 CPython 不是正确的选择。但这真的是嵌入时的问题吗?你能进一步扩展用例吗? 我有几个工作线程和一个 UI 线程,工作线程和 UI 都有部分用 C++ 编写,但尽可能多的代码应该是可扩展和可修改的,无需重新编译。跨度> 根据我的阅读,stackless 使用协作调度,这意味着它的微线程类似于光纤。我的多线程目标是同时使用多个 CPU 内核。 在我看来,您更希望将 C/C++ 嵌入到脚本语言中。 :) javascript 不支持线程... 【参考方案1】:Lua 可能值得一试。它可以用于thread-safe manner,并且该语言支持'co-routine' 概念,这可能符合您的要求。
【讨论】:
此外,LUA 已明确设计用于应用程序内脚本,并且有大量性能优化、多线程、图形密集型 C++ 应用程序(又名“视频游戏”)使用 LUA 编写用户脚本。您还可以选择向脚本端公开哪些部分。 协同程序没有同时运行。 lua 可以通过序列化所有对 lua_State 对象的访问以线程安全的方式使用。这意味着协程实际上是单线程的。 Lua 的简单语法使得 编写 的乐趣不如 Ruby(或者,我假设是 Python),但使其非常可读。跨度> 看看 Lua Lanes:luaforge.net/projects/lanes 用于多核线程。【参考方案2】:Lua 是最好的选择。 Python、Ruby 和 JavaScript 是大型语言,它们不是为嵌入而设计的。但是 Lua 不同,它是为嵌入而设计的。
对于您的脚本语言,您应该比其他任何事情更多地考虑“限制”。嵌入脚本可以很容易地用于 hack(不好的意思)。
例如,默认情况下 Lua 不能打印到控制台。据我所知,暴雪因此使用 Lua。
【讨论】:
"例如,默认情况下 Lua 不能打印到控制台。"但是,您可以通过将它们设置为 nil 或在初始化代码中根本不加载包含库来轻松避免不需要的函数。 我的意思是,这不是真的:默认情况下,Lua 可以打印到控制台 我同意 Lua 是一个不错的选择,但 Python 和 JavaScript 都是被设计为嵌入的。 Python 被设计成也可以独立运行,但它在设计上一直是非常可嵌入的。 JavaScript 从第一天就嵌入(在网络浏览器中);独立的 JavaScript 是一个相对较新的发明。【参考方案3】:在选择 Lua 而不是 Python 和 JScript 时,我遇到了同样的困境。 Lua 最擅长的事情是使用 luabridge 和 luabind 等库与 C/C++ 代码进行出色的互操作。也就是说,您可以从 C++ 调用 lua 并让脚本调用回 C++ 没有问题,从脚本访问 c++ 数据,反之亦然。
Python 和 Lua 等语言的问题在于,该语言真的不是常规意义上的多线程:如果一个 C++ 线程使用语言脚本引擎运行脚本,您不能使用相同的引擎来运行另一个脚本。两种语言都有一个引擎范围的锁,可以在这些情况下使用,以确保引擎的完整性得到维护。但是,这两种语言都是多线程的,您可以在后台运行函数并与您想要的任何同步对象进行交互(就像从 C++ 中一样)。因此,我选择让所有从 C++ 创建的线程和脚本代码仅在专用线程(每个引擎的线程)中运行,并以常规方式与应用程序中的其他线程交互。
如果您需要将数据和控制从 C++ 传递给脚本,反之亦然,Lua 比 Python 好得多。除此之外,我不会在 C++ 项目中托管 CLR。太乱了。
【讨论】:
【参考方案4】:您可以考虑嵌入一个流行的 JavaScript 引擎。它们不仅速度快且得到很好的支持,而且很多人都知道如何用 JavaScript 编程,因此很容易被大量受众采用和阅读。
根据this answer,SpiderMonkey engine 是线程安全的,而Google/Chrome's V8 可能不是。
【讨论】:
Seconded... 同样,作为“workers”运行脚本也可能是一个更好的用途。 SpiderMonkey 也拥有 E4X 王牌。虽然 V8 有 CommonJS 和许多快速增长的库,但可能不适合嵌入 moz。 +1,javascript 非常流行,而且速度很快!【参考方案5】:JScript 是一个很好的解决方案。 Windows Script Host 已经支持它,并通过事件模拟多线程。我向你保证,它比 Python 更容易使用。 This MSDN article 是一个很好的参考。
【讨论】:
【参考方案6】:可以使用Guile,这是可嵌入的Scheme。
【讨论】:
不满足要求。我不认为 lisp 是一种可读的语言。而且 GPL 不兼容闭源项目。 是 LGPL,完全兼容闭源项目。 我确实认为 Lisp 是一种可读的语言。怎么办? ;-) 由于 Guile 是一个 VM,它支持除了 Scheme 之外的其他语言。我相信 ECMAscript 是唯一官方支持的,但也有一个支持 Lua 的 git 分支。【参考方案7】:Lua 真的很容易集成,并且可以使用 Lua Lanes 之类的东西在多个线程中工作(这是跨平台的 Windows/Linux/MacOS)。
【讨论】:
【参考方案8】:我很确定 Stackless Python 将是唯一支持开箱即用的多线程的。 Stackless Python 被 CCP 选择用于他们的 MMO:Eve-Online,特别是因为代码的无堆栈性质允许他们在构建必要的原语以使整个线程安全后,在他们需要的任何 OS 线程上安排延续。
Lua 可以在多线程环境中使用,但是每个并发线程都需要一个单独的 lua_State 对象,因此您需要为 lua 代码构建自己的线程间消息传递系统,在单独的 lua 状态的上下文中执行,以交流。
【讨论】:
【参考方案9】:你可以试试蜘蛛猴。查看基于 Libjspp C++ 模板的包装器,用于嵌入和扩展 Javascript 引擎 spidermonkey: http://code.google.com/p/libjspp/
【讨论】:
【参考方案10】:完全基于偏好。大多数语言都可以在 C 中嵌入,并提供导出到脚本环境的选项。
如果是我,我会选择 V8 Javascript。
【讨论】:
【参考方案11】:“多线程”我假设您的意思是“可以有效地利用多个内核”?如果您的系统只有一个 CPU,那么无论您选择哪种脚本语言,您一次只能完成一件事。
如果您决定采用 CPython 路线,那么要记住的主要事情是只有脚本引擎本身受全局解释器锁保护。如果正在执行的脚本花费大量时间调用非 Python 代码(包括 I/O 和其他系统级操作),那么它可以非常愉快地利用多个线程。
另一个需要考虑的因素是,Python 的自省功能本身就很难正确保护(Google 已经为 AppEngine 做到了这一点,但他们不得不在此过程中禁止很多事情)。
鉴于 Javascript 引擎在浏览器中的流行以及 Lua 引擎在 PC 游戏中的流行,其中之一可能是更简单的方法。
【讨论】:
【参考方案12】:试试Falcon编程语言
【讨论】:
您可能想为 OP 的利益解释您的答案以上是关于哪种脚本语言更适合嵌入多线程 C/C++ 应用程序 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章