Ruby与Lua比作为C ++脚本语言
我正在构建一个游戏服务器(不是引擎),我希望它可以像插件系统一样可扩展。
我找到的解决方案是使用脚本语言。到目前为止,看起来不错。
我不确定是否应该使用Ruby还是Lua。Lua更容易嵌入,但Ruby有更大的库,并且有更好的语法(依我之见)。问题是,我没有找到一个简单的方法来使用Ruby作为C ++的脚本语言,而使用Lua非常容易。
有关此事的想法?使用Ruby作为脚本语言的建议(我尝试了SWIG,但它并不像使用Lua那样整洁)?
谢谢。
原文链接 https://stackoverflow.com/questions/5327340
我以前尝试过将 Ruby 嵌入到 C/C++ 中,但发现它非常困难。你会面临很多挑战:
- 从 C/C++ 调用 Ruby 需要编写两层函数(一层用于调用,另一层用于捕获异常)
- 从 Ruby 回调到 C/C++ 需要进行常规的 SWIG 类型工作
- 数据的来回传递需要仔细跟踪分配,因为 Ruby 会试图清除任何它可以清除的东西
我相信这 可以 做到,但对我来说似乎非常困难,只有在最小化进入点的情况下才能成功跳入 Ruby。
Go for lua, though i'd recommend luajit, not only for speed, but for the new ffi library, boosting intercommunication to the max :). Lua also has tones of modules, and new ones are very easy to create, this makes up for the lack in its stdlib.
可以选择 Lua,但我会推荐使用 LuaJIT,不仅因为其速度快,还因为其新的 ffi 库,最大限度提升了互操作性:)。Lua 也有众多模块,且新模块很容易创建,这弥补了其标准库的不足。
我过去广泛地使用了Lua。
Luabind非常易于使用,无需像SWIG这样的外部生成器,文档也非常好。编译时间仍然不错。
我看到的最大问题是:Lua主要是…只能写。你实际上没有类,只有带有少量语法糖的关联数组(object['key']可以写成object.key),所以你很容易在一个晦涩的函数中添加一个“成员”,完全忘记它,并在后来产生副作用。
仅此一个原因,我更喜欢Python。Boost::Python是Luabind的基础,因此两者具有类似的API(Luabind曾经稍微容易构建,但现在不再是这样了)。在功能上,它们相当等效。
而与此并不直接相关的是:这两者都无法在多线程环境下可靠地使用(因此这取决于您的服务器的复杂性)。
- N个Python线程:GIL(全局解释器锁)会妨碍您。每次在线程中使用变量时,都会被锁定,因此它有点破坏了这一点,除非进行长时间的I/O操作和调用C函数。
- Lua有协程,但它们不能并行化。
- Ruby线程并不真正是线程,而类似于Lua的协程。
请注意,您仍然可以为每个线程创建一个环境,但它们将无法通信(除非使用C++机制)。这在Lua中尤其容易。
一件 Lua 很出色的事情是它可以非常容易地在 C++(或 C)和它本身之间传递数据。基本上,你只需要将数据推入 / 弹出栈中即可在两者之间进行通信。同时运行多个 Lua 环境也相当简单(如果需要这样的功能的话)。虽然 Lua 是一种垃圾回收语言,但很容易防止它在需要在你的 C++ 代码中保持的数据上执行此操作。一旦打好基础,使用 Lua 创建可扩展的插件系统应该很容易。在运行时交换插件(在这种情况下是脚本)也很容易(尽管 Ruby 也可能如此,但我对它不够熟悉以知道)。
一个需要考虑的问题是你希望你的脚本能够处理多少面向对象的内容。Lua 使用函数、表、元表和原型来实现类似面向对象的编程。有些人喜欢它,有些人不喜欢;个人认为,有时候使用起来有点笨重,但很有趣。我没用过 Ruby,所以无法对它说些什么,但你可能需要权衡你对对象 / 类支持的需求。
我认为在你的情况下,你还应该考虑你希望有多快地启动项目。正如你和其他人指出的那样,Ruby 很难嵌入到 C++ 中,而 Lua 不是。时间总是宝贵的,如果你想尽快让某些东西运行起来,Lua 可能是你的最佳选择。
- 如何在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 模式将字符串(嵌套数组)转换为真正的数组?
我会选择最容易学习/使用者最多的。您希望尽可能让客户能够轻松使用它。