В прошлом метод привязки Ruby к C (или C к Ruby, это не имеет большого значения) записывал расширение MRI C вручную. SWIG в основном автоматизирует это, но по-настоящему дерьмово, так что писать его вручную обычно проще, быстрее, более результативно.
Однако есть существенные проблемы с расширениями MRI C: это MRI C расширения. Это было прекрасно, когда MRI была единственной реализацией Ruby, но теперь у нас есть три готовых к выпуску Ruby Implementations с еще двумя в пути в ближайшие пару недель, а еще два или три будут выпущены в конце этого года.
Конечно, есть еще одна проблема, с расширениями МРТ C: вы должны написать их в C.
Лучшим решением является DL library in the Ruby standard library, который позволяет связываться с динамической библиотеки (.dll
, .so
, .dylib
) во время выполнения, в чистом Ruby. К сожалению, это довольно плохо документировано, и из-за этого он не очень хорошо поддерживается (или полностью не поддерживается) несколькими Ruby-реализациями: как вы собираетесь предоставлять совместимую реализацию, если нет документации о том, что означает «совместимая реализация»?
Rubinius представил Rubinius Foreign Function Interface (FFI), который much easier to use than DL, гораздо легче реализовать для рубин VM писателей и fully documented, specified и tested. JRuby немедленно скопировал API, Уэйн Мейснер написал two C extensions for MRI and YARV, tinyrb поддерживает его, IronRuby, MacRuby и MagLev будет довольно скоро.
Таким образом, если вы используете FFI, вы не должны написать одну строку C, и вашей библиотеки будет автоматически работать на МРТ, YARV, JRuby и Rubinius и в будущем также на IronRuby, MacRuby и MagLev.
Спасибо Jorg. FFI выглядит многообещающе. – rmk