Gauche:FFI

Gauche:FFI

FFI (Foreign Function Interface) とは

仕組みのこと。良く有るのは高レベル言語から低レベルレイヤのCライブラリ 等を呼び出すような場合。

一方の言語から他方の言語へ引数やら呼び出し形式やらを変換し、 返って来た値をもとの言語へと変換してやる仕組みが必要。 一般にstubと呼ばれる。また、他方の言語のデータ構造にアクセスするための APIもFFIに含まれる。

ターゲット言語にどう埋めこまれるか、および stubをどのくらい動的に構成するかという点でいくつか実装戦略が考えられる。

最もソフィスティケートされた形式は、ターゲット言語に若干の宣言を 付加するだけで、ターゲット言語の手続きと同様に呼び出せる、というようなもの。

インタプリタや中間コード実装の場合、それを実現するには 実行時ライブラリが外部関数宣言を解釈しなければならない。 難しくはないがオーバヘッドは大きくなる。 そのため、ターゲット言語とは別ファイルに宣言を記述しておき、 そちらをネイティブコードコンパイルした上で実行時ライブラリに 結合する、という方法がとられることもある。Gaucheは現在この方針。

ネイティブコンパイラやCへのトランスレータを持つ処理系では、 ターゲット言語中の宣言を参考に外部関数呼び出しをコンパイルすれば 良いだけなので、特にオーバヘッドは無いし、宣言部だけ分ける必要もない。

GaucheのFFI

当分は現行のstubファイルに記述する方式を使う予定。 ただ、記述形式は改善してゆく。

ダイナミックに外部関数を呼べるようにするのは1.0以降になると思う。

foreign pointer object

0.8.6で入る、foreign pointer objectについて質問があったんで説明しときます。 これはCのbindingを書きやすくするためのレイヤで、Scheme側から 特別に新しいことができるようになるわけではありません。

今までは、C側のオブジェクトをScheme側に見せるためには、

といった手間がかかりました。

ScmForeignPointerオブジェクトは、

というわけで手間が結構簡略化されます。詳しくはCVS HEADの examples/mqueue-cpp/mqueue_glue.{h,cpp} あたりを見て下さい。 (APIはまだ変更の可能性があります。現在のCVS HEADを当てにして 開発を進める場合は注意!)

なお、foreign pointerが指している先のC側オブジェクトへのアクセサは bindingで書いてやらないと、Schemeからアクセスできません。

参考資料

More ...