Раньше метод перехода для привязки Ruby к C (или C к Ruby, это не имеет значения) писал вручную расширение MRI C. SWIG в основном автоматизирует это, но очень дурацким способом, так что написание его вручную обычно проще, быстрее, более производительно.
Однако существует существенная проблема с расширениями MRI C: они являются MRI C расширениями. Это было хорошо, когда MRI была единственной реализацией Ruby, но теперь у нас есть три готовые к реализации реализации Ruby, еще две готовятся к использованию в ближайшие пару недель и еще две или три будут выпущены позднее в этом году.
Конечно, есть еще одна проблема с расширениями MRI C: вы должны написать их на C.
Лучшим решением является библиотека DL в стандартной библиотеке Ruby , которая позволяет связывать динамическую библиотеку (.dll
, .so
, .dylib
) во время выполнения в чистом Ruby. , К сожалению, он довольно плохо документирован, и из-за этого он не очень хорошо поддерживается (или полностью не поддерживается) несколькими реализациями Ruby: как вы собираетесь предоставлять совместимую реализацию, если нет документации о том, что означает «совместимая реализация»?
Rubinius представил Интерфейс внешних функций Rubinius (FFI) , который намного проще в использовании, чем DL , намного проще реализует для писателей Ruby VM и полностью документировано , указано и протестировано . JRuby немедленно скопировал API, Уэйн Мейснер написал два расширения C для MRI и YARV , tinyrb поддерживает его, IronRuby , MacRuby и MagLev появятся довольно скоро.
Итак, если вы используете FFI, вам не придется писать ни одной строки из C, и , ваша библиотека будет автоматически работать на MRI, YARV, JRuby и Rubinius, а в будущем также на IronRuby. , MacRuby и MagLev.