MRIおよびRubiniusは、Ruby固有の拡張のサポートがあり、ネイティブコードがRubyコードやRubyインタープリターもしくはVMと対話することを可 能にする。Ruby 1.8.0は、共用ライブラリのロードを許可したり、Rubyコードから指定された関数を呼び出すことを許可するRuby/DLを採用した(リンク)。 Ruby/DLドキュメンテーション(リンク)は、関数のインポートの仕方、動作方法、RubyをCタイプにマップする方法などを示している。また、Ruby/DL はコールバックとの双方向通信を提供している。関数ポインターを要求するC関数にRubyブロックを手渡すことができる。
Rubiniusは、Ruby/DLと類似した独自のForeign Function Interface (FFI)を導入した(リンク)。FFIのAPIは、多少異なるが(リンク)。それは、Ruby/DLが使用するような、Cコードのストリングもしくはカスタムタイプ指定子 フォーマットではなく、Rubyシンボルおよびタイプシグニチャーの配列リテラルを使用する。
今年の初め、JNA(参考記事)にビルドされたjruby-ffi(参考記事)が導入された(JRubyはRuby/DLに対するサポートがない)。
RubiniusおよびJRubyに対するサポートは利用可能であったが、MRIを使用しているRuby分野の大部分が、共用ライブラリを使用するため に、まだRuby/DLや他の方法を使用していることを指す。これを修正するために、ruby-ffiプロジェクト(リンク)がWayne Meissner氏(すでにjruby-ffiを作成)によって作成され(リンク)、Rubinius for JRuby、Ruby 1.8.xおよびRuby 1.9.xと同様のFFIインターフェイスを提供している。これを使用して、これらすべてのRuby実装全体で同様のRubyコードを使用して、共用ライ ブラリにアクセスすることが可能である。
Ruby FFI 0.2.0は、現在利用可能である(リンク)。gem install ffi
でインストールできる。ドキュメンテーションはプロジェクトのwikiで利用可能であり(リンク)、Examplesのページ(リンク)から始めると良い。 Charles Nutter氏は、FFIを使用するにあたって、さらに詳しい説明およびサンプルを提供している(リンク)。
原文はこちらです:http://www.infoq.com/news/2008/12/ruby-ffi-on-mri-jruby