Ruby与Lua比作为C ++脚本语言

我正在构建一个游戏服务器(不是引擎),我希望它可以像插件系统一样可扩展。

我找到的解决方案是使用脚本语言。到目前为止,看起来不错。

我不确定是否应该使用Ruby还是Lua。Lua更容易嵌入,但Ruby有更大的库,并且有更好的语法(依我之见)。问题是,我没有找到一个简单的方法来使用Ruby作为C ++的脚本语言,而使用Lua非常容易。

有关此事的想法?使用Ruby作为脚本语言的建议(我尝试了SWIG,但它并不像使用Lua那样整洁)?

谢谢。

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

点赞
stackoverflow用户79737
stackoverflow用户79737

我会选择最容易学习/使用者最多的。您希望尽可能让客户能够轻松使用它。

2011-03-16 15:54:46
stackoverflow用户570081
stackoverflow用户570081

你可能有兴趣学习Squirrel。我相信它是《求生之路2》使用的脚本语言。它比lua更先进(使用对象和类),且旨在轻松嵌入C++应用程序中,这似乎正是你所寻找的。

2011-03-16 16:03:01
stackoverflow用户113987
stackoverflow用户113987

我以前尝试过将 Ruby 嵌入到 C/C++ 中,但发现它非常困难。你会面临很多挑战:

  • 从 C/C++ 调用 Ruby 需要编写两层函数(一层用于调用,另一层用于捕获异常)
  • 从 Ruby 回调到 C/C++ 需要进行常规的 SWIG 类型工作
  • 数据的来回传递需要仔细跟踪分配,因为 Ruby 会试图清除任何它可以清除的东西

我相信这 可以 做到,但对我来说似乎非常困难,只有在最小化进入点的情况下才能成功跳入 Ruby。

2011-03-16 16:48:11
stackoverflow用户255049
stackoverflow用户255049

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 也有众多模块,且新模块很容易创建,这弥补了其标准库的不足。

2011-03-16 16:56:35
stackoverflow用户124038
stackoverflow用户124038

我过去广泛地使用了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中尤其容易。

2011-03-16 18:08:26
stackoverflow用户263356
stackoverflow用户263356

一件 Lua 很出色的事情是它可以非常容易地在 C++(或 C)和它本身之间传递数据。基本上,你只需要将数据推入 / 弹出栈中即可在两者之间进行通信。同时运行多个 Lua 环境也相当简单(如果需要这样的功能的话)。虽然 Lua 是一种垃圾回收语言,但很容易防止它在需要在你的 C++ 代码中保持的数据上执行此操作。一旦打好基础,使用 Lua 创建可扩展的插件系统应该很容易。在运行时交换插件(在这种情况下是脚本)也很容易(尽管 Ruby 也可能如此,但我对它不够熟悉以知道)。

一个需要考虑的问题是你希望你的脚本能够处理多少面向对象的内容。Lua 使用函数、表、元表和原型来实现类似面向对象的编程。有些人喜欢它,有些人不喜欢;个人认为,有时候使用起来有点笨重,但很有趣。我没用过 Ruby,所以无法对它说些什么,但你可能需要权衡你对对象 / 类支持的需求。

我认为在你的情况下,你还应该考虑你希望有多快地启动项目。正如你和其他人指出的那样,Ruby 很难嵌入到 C++ 中,而 Lua 不是。时间总是宝贵的,如果你想尽快让某些东西运行起来,Lua 可能是你的最佳选择。

2011-03-17 05:14:01