哪种脚本语言更适合嵌入多线程的C/C++应用程序中?
考虑以下要求:
- 必须支持Windows。最好也能在其他平台上工作。
- 必须支持多线程。这意味着引擎可以在多个线程中并行工作。
- 可读性很重要。
- 许可证必须与闭源项目兼容。
我喜欢Python的可读性。我也比其他脚本语言更有经验地使用Python。然而,CPython不支持多线程,而IronPython需要托管CLR和兼容的语言(C++ / CLI或C#)。
原文链接 https://stackoverflow.com/questions/4756544
我之前也面临过这个选择,最终选择了Lua而不是Python和JScript。
Lua最擅长的一点是与C/C++代码的极佳互操作性,使用诸如luabridge和luabind这样的库。也就是说,您可以从C++中调用lua,并在脚本中回调到C++,从脚本访问C++数据,反之亦然。
像Python和Lua这样的语言的问题在于,语言在常规意义上并不真正支持多线程:如果一个C++线程正在使用语言脚本引擎运行脚本,则您不能使用相同的引擎运行另一个脚本。这两种语言都有一个引擎范围的锁,可以在这些情况下使用,以确保引擎完整性得到维护。但是,在函数在后台运行并且可以与任何同步对象进行交互的意义上,这两种语言都是多线程的(就像从C++中一样)。因此,我选择从C++创建所有线程,脚本代码仅在专用线程中运行(每个引擎一个线程),并以常规方式与应用程序中的其他线程进行交互。
如果您需要从C++传递数据和控制到脚本以及反之,则Lua比Python更好。此外,我不会在C++项目中托管CLR。这太混乱了。
我很确定 Stackless Python 将成为支持多线程的唯一选择。CCP 选择使用 Stackless Python 来支持他们的 MMO 游戏:Eve-Online,主要是因为代码的无栈特性使他们能够在任何他们需要的操作系统线程上调度连续性,一旦他们建立了必要的原语来保证整个线程的安全性。
Lua 可以在多线程环境下使用,但每个并发线程都需要一个独立的 lua_State 对象,因此您需要为 Lua 代码构建自己的线程间消息传递系统,在独立的 Lua 状态的上下文中执行以进行通信。
Lua 是最好的选择。Python、Ruby 和 JavaScript 是大型语言,不适合嵌入其他程序中。但 Lua 不同,它是为嵌入而设计的。
你应该更加考虑你的脚本语言对“限制”的支持,而非其他方面的支持。易于嵌入的脚本语言通常都容易用于恶意攻击。
例如,Lua 默认是无法向控制台打印输出的。我所知道的,暴雪公司就是因为这一点而选择了 Lua。
你可以考虑嵌入一个流行的 JavaScript 引擎。它们不仅快速且得到良好的支持,而且很多人都知道如何编程 JavaScript,因此它将被大多数人轻松采用和阅读。
根据这个回答,SpiderMonkey 引擎 是线程安全的,而Google/Chrome 的 V8可能不是。
Lua非常容易集成,并且可以使用像[Lua Lanes](http://kotisivu.dnainternet.net/askok/bin/lanes/)这样的多线程来工作(它是跨平台的Windows / Linux / MacOS)。
完全基于偏好。大多数编程语言都有一种将其嵌入到 C 中的方式,并提供将其导出到脚本环境的选项。
如果是我,我会选择 V8 Javascript。
若你所指的"multithreaded"指的是"能有效利用多核心",那么即使选择任何一种脚本语言,如果你的系统仅有一颗处理器,就只能同时进行一项任务。
如果你决定选择CPython,要知道的主要事情是,全局解释器锁只会保护正在执行的脚本引擎本身。如果被执行的脚本在调用非Python代码(包括I/O和其他系统层操作)时花费了大量时间,那么它可以愉快地利用多个线程。
另一个要考虑的因素是,Python的内省能力使它固有地难以被妥善保护(虽然谷歌已经为AppEngine解决了这个问题,但在此过程中必须禁止许多东西)。
考虑到浏览器中广泛使用的Javascript引擎和PC游戏中常用的Lua引擎,它们中的一个可能是更容易前进的方法。
你可以尝试使用 SpiderMonkey。查看基于模板的 C++ 包装器 libjspp,用于嵌入和扩展 Javascript 引擎 SpiderMonkey: http://code.google.com/p/libjspp/
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
JScript
是一个很好的解决方案。它已经被Windows脚本主机支持,并使用事件模拟了多线程。我向你保证,它比Python更容易使用。这篇MSDN文章是一个很好的参考。