我希望从现有的c库中生成ruby模块。
在过去,我用过swig,发现它是一个痛苦的任务。我只是想看看有没有比Ruby更好的东西,还有什么问题。
只是需要评估选择,所以即使是一个简单的网址指向我的网站将做!
最佳答案
在过去,将ruby绑定到c(或者c绑定到ruby,其实并不重要)的go-to方法是手工编写mric扩展。SWIG基本上是自动化的,但方式非常糟糕,所以用手写通常更容易、更快、更高效。
然而,mri c扩展有一个重要的问题:它们是mric扩展。这很好,当mri是唯一的ruby实现时,但是现在我们有三个生产就绪的ruby实现,另外两个将在未来几周内发布,还有两到三个将在今年晚些时候发布。
当然,mri c扩展还有一个问题:必须用c编写它们。
更好的解决方案是DL library in the Ruby standard library,它允许您在运行时用纯ruby绑定到动态库(.dll
,.so
,.dylib
)。不幸的是,它的文档记录非常糟糕,因此,几个ruby实现并没有很好地支持它(或者完全不支持它):如果没有文档说明“兼容实现”的含义,您将如何提供一个兼容的实现?
Rubinius引入了Rubinius Foreign Function Interface (FFI),它是much easier to use than DL,对于ruby虚拟机编写器和fully documented、specified和tested来说更容易实现。JRuby立即复制了api,韦恩•迈斯纳写道,two C extensions for MRI and YARV支持它,tinyrb,IronRuby和MacRuby很快就会实现。
所以,如果你使用ffi,你不必写一行c,你的库将自动运行在mri、yarv、jruby和rubinius上,将来也会运行在ironruby、macruby和maglev上。