我希望从现有的C库中生成ruby模块。
过去,我使用过Swig,发现这是一项痛苦的任务。我只是想检查一下Ruby是否有更好的东西,以及任何陷阱。
只需要评估选择,所以即使是一个简单的网址指向我的网站也会这样做!
答案 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 documented,specified }和tested。 JRuby立即复制了API,Wayne Meissner写了two C extensions for MRI and YARV,tinyrb支持它,IronRuby,MacRuby和MagLev将很快。
因此,如果您使用FFI,则不必编写单行C,和您的库将自动在MRI,YARV,JRuby和Rubinius上运行,并且将来也会在IronRuby,MacRuby和MagLev。