【问题标题】:Can I script a C++ application with Ruby like with Lua?我可以像使用 Lua 一样使用 Ruby 编写 C++ 应用程序吗?
【发布时间】:2013-05-15 20:19:14
【问题描述】:

我刚刚开始阅读 Ruby,我想知道它是否可以嵌入到像 Lua 这样的 C++ 应用程序中,它提供了一个库来解析给定的脚本文件:https://stackoverflow.com/a/5127294/399107

【问题讨论】:

  • 出于好奇,因为我偏向于 Lua ;)。为什么你更喜欢 Ruby?

标签: c++ ruby lua


【解决方案1】:

是的,你可以。您只需在您的应用程序中嵌入一个 Ruby 引擎。

请注意,与主要的 Lua 引擎不同,一些 Ruby 引擎并不是非常适合嵌入到其他程序中。但是,例如,RubiniusIronRubyJRuby 是专门为嵌入而设计的,即使它不漂亮,您也可以嵌入 YARV 或 MRI,即使它们不是为此而设计的。

还有MRuby,但与其他人不同的是,它没有实现完整的 Ruby 语言规范,它只实现了 ISO Ruby 规范的一个子集,它本身只是 Ruby 1.8 和 Ruby 交集的一小部分1.9。另外,它还没有发布,甚至its homepage 还不存在的事实证明了这一点。然而,它是专门为嵌入而设计的,在这个词的两个意义上:嵌入到其他程序中,以及在 RAM 很少的嵌入式设备上有用。

您可能已经注意到,如果应用程序在 Java 平台或 CLI 上运行,则将 Ruby 嵌入到您的应用程序中要容易得多。对于 Java 平台和 CLI, C++ 编译器,因此该选项并非完全不可能。否则,我会说 Rubinius 更容易嵌入,但更多人尝试嵌入 YARV,因此有更多关于如何做到这一点的博客文章。 (或者也许,嵌入 Rubinius 是如此微不足道,没有人需要写关于它的博客文章。)

很久以前,有人正在为 Lua VM 实现 Ruby,但该实现从未成功。不过会解决你所有的问题:-)

【讨论】:

  • 很详细的回答!但是我越来越担心 Ruby 不适合我的目的。
  • 我参加聚会可能有点晚了;但仍想通过添加嵌入 ruby​​ 可能是安全噩梦来扩展 Jörg 的响应,如果您不控制要运行的脚本。虽然 lua 没有标准库可言,因此只能做你明确向它公开的事情,但 Ruby 带有它的 std 库,它允许所有的事情,包括读取和写入文件以及与互联网交互。根据您的用例,这可能很酷或最终很危险。
【解决方案2】:

当然可以。可以使用SWIG,或者您可以为它制作自己的绑定(或谷歌查看是否有人已经完成了这项工作)。最大的问题是你真的想要吗? ruby 解释器很重,界面也不是很好。

Matz 正在开发一个名为 mruby 的可嵌入 Ruby 版本,它力求像 Lua 一样易于嵌入和轻量级。但它仍然是 alpha 质量。

【讨论】:

  • 好吧,如果解释器的成本很高,那么 Ruby 对我来说不是最佳选择。很遗憾,我喜欢到目前为止所读到的内容。
【解决方案3】:

是的,这是可能的。大多数标准库类型都是用 C 编写的。当您可以使用 C 时,您也可以使用 C++。使用extern "C" 声明的函数来获得正确的绑定。当使用与用于编译 ruby​​ 解释器的编译器不同(不同版本)的 C++ 编译器时,我遇到了很多麻烦。

这里是 pick axt 书的一部分,涵盖了 ruby​​ 扩展库:http://media.pragprog.com/titles/ruby3/ext_ruby.pdf

在一个开源 C++ Web 服务器项目中,我编写了一个 ruby​​ / rack 适配器,以使用带有 rails 的服务器:https://github.com/TorstenRobitzki/Sioux/tree/master/source/rack

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多