Ruby vs Lua作为C ++的脚本语言

时间:2011-03-16 15:11:25

标签: c++ ruby lua

我目前正在构建游戏服务器(不是引擎),我希望它可以扩展,就像插件系统一样。
我找到的解决方案是使用脚本语言。到现在为止还挺好。

我不确定我是否应该使用Ruby或Lua。 Lua更容易嵌入,但Ruby有一个更大的库,更好的语法(在我看来)。问题是,我发现使用Ruby作为C ++脚本语言没有简单的方法,而Lua则非常容易。

坚持这个?使用Ruby作为脚本语言的建议(我尝试过SWIG,但它不像使用Lua那样整洁)?

感谢。

6 个答案:

答案 0 :(得分:12)

我之前看过将Ruby嵌入到C / C ++中,看起来非常困难。你将面临很多挑战:

  • 从C / C ++调用Ruby需要编写2层函数(一层要调用,一层用于捕获异常)
  • 从Ruby调用C / C ++需要正常的SWIG类型工作
  • 来回移动数据需要仔细跟踪分配,因为Ruby会想要垃圾收集任何东西

我确信这个可以完成,但对我来说这似乎非常困难,只有你能在最少的入口点跳进Ruby才能实现。

答案 1 :(得分:8)

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

答案 2 :(得分:6)

您可能有兴趣了解Squirrel。我相信它是Left 4 Dead 2使用的脚本语言。它比lua更高级(使用对象和类),并且可以轻松嵌入到C ++应用程序中,这听起来就像你正在寻找的那样。

答案 3 :(得分:2)

去寻找lua,虽然我推荐luajit,不仅仅是为了速度,而是为了新的ffi库,增强了对最大的互通:)。 Lua也有模块的音调,新的模块很容易创建,这弥补了stdlib的不足。

答案 4 :(得分:1)

Lua要做的一件事就是它能够非常轻松地在C ++(或C)与其自身之间传递数据。基本上,您只是将数据推送/弹出到堆栈中,以便在两者之间进行通信。同时启动和运行多个Lua环境也非常简单(如果您需要该功能)。尽管Lua是一种垃圾收集语言,但很容易阻止它在需要在C ++代码中保留的数据上这样做。一旦你奠定了基础,Lua就可以轻松创建一个可扩展的插件系统。在运行时交换插件(在这种情况下,脚本)也非常简单(尽管对Ruby来说也是如此,我对它的了解还不够熟悉)。

要考虑的一件事是您希望脚本能够处理多少面向对象的内容。 Lua使用函数,表,元表和原型来实现类似OO的编程。有些人喜欢它,有些人不喜欢;我个人觉得有趣的是,如果有时候有点笨拙的话。没有使用Ruby,我不能代表它,但你可能想要权衡对象/类支持的需求。

我认为在您的情况下,您还应该考虑您希望项目启动和运行的速度。正如你和其他人所指出的那样,Ruby很难嵌入到C ++中,而Lua则不然。时间永远是宝贵的,如果你想尽快得到一些工作,Lua可能是你最好的选择。

答案 5 :(得分:0)

我会选择最容易学习的东西/让大多数玩家使用它。您希望它尽可能地为您的客户所用。