Swig替代Ruby?

时间:2010-03-05 01:52:31

标签: c ruby interface

我希望从现有的C库中生成ruby模块。

过去,我使用过Swig,发现这是一项痛苦的任务。我只是想检查一下Ruby是否有更好的东西,以及任何陷阱。

只需要评估选择,所以即使是一个简单的网址指向我的网站也会这样做!

1 个答案:

答案 0 :(得分:5)

过去,将Ruby绑定到C(或C到Ruby,它并不重要)的首选方法是手动编写MRI C扩展。 SWIG基本上是自动化的,但是以一种非常糟糕的方式,所以手写它通常更容易,更快,更高效。

然而,MRI C扩展存在严重问题:它们是 MRI C扩展。这是好的,当MRI是唯一的Ruby实现时,但现在我们有三个生产就绪的Ruby实现,另外两个将在未来几周内完成,另外两个将在今年晚些时候发布。

当然,MRI C扩展还有另一个问题:你必须用C语言编写它们。

更好的解决方案是DL library in the Ruby standard library,它允许您在运行时以纯Ruby绑定到动态库(.dll.so.dylib)。遗憾的是,它的记录非常糟糕,因此,几个Ruby实现并没有很好地支持(或完全不支持):如果没有“兼容实现”的含义的文档,你将如何提供兼容的实现呢? / p>

Rubinius引入了Rubinius Foreign Function Interface (FFI)much easier to use than DL,更容易实现 Ruby VM编写器和fully documentedspecified }和testedJRuby立即复制了API,Wayne Meissner写了two C extensions for MRI and YARVtinyrb支持它,IronRubyMacRubyMagLev将很快。

因此,如果您使用FFI,则不必编写单行C,您的库将自动在MRI,YARV,JRuby和Rubinius上运行,并且将来也会在IronRuby,MacRuby和MagLev。