Foreign function interface

Foreign function interface（フォーリン・ファンクション・インターフェイス、FFI）とは、あるプログラミング言語から他のプログラミング言語で定義された関数などを利用するための機構。主に高水準言語からC/C++などの関数やメソッドを呼び出し、OS固有の機能などを利用するために使用されることが多い。

FFIという用語はCommon Lispにおける仕様に由来し、Haskellでも同様にFFIという用語が使われている。Adaなどでは言語間バインディング（または単にバインディング, language binding）と呼ばれている。

FFIという用語自体に「関数（Function）」という言葉が含まれているが、多くのFFIでは単に他言語で書かれた関数が呼び出せるだけではなく、オブジェクトのメソッドを呼び出したり、その返り値を取得し、データ型やクラスを言語間で相互変換することができる。

概要 
主なFFIの機能は、呼び出し側の言語（ホスト言語）と呼び出し先の言語（ゲスト言語）の呼出規約やセマンティックスを擦り合わせることである。主に以下の方法などで実装される。

 ゲスト言語の呼び出し先関数に対して、ホスト言語から利用可能な特定のプロトコルを実装することを要求する（例：Java Native Interface）。
 ゲスト言語の関数を「ラップ」するグルーコードを記述したラッパーライブラリを作成する。（例：Haskell 98 FFI）
 ゲスト言語に定義された関数が、ホスト言語の機能やセマンティックスのサブセットであることを要求する（例：C++からC言語の機能の利用）

なお、FFIの利用や実装には次のようなケースに注意が必要である。

 他方の言語がガベージコレクションの機能を持っていない場合、オブジェクトの参照や破棄が適切に行われない場合がある。場合によっては手動でオブジェクトの管理を行う必要がある。
 言語間でのデータ型やオブジェクトの変換が難しい場合がある。
 上記データ型の変換の問題などのために、言語間で同一のインスタンスへの参照が難しい場合がある。
 一方または両方の言語が仮想マシン上で動作している場合がある。また、２つの言語が異なる仮想マシンで動作していることもある。
 継承、オブジェクトや型の合成などが言語間で異なる場合。

例

脚注

関連項目 
 束縛 (情報工学)
 アプリケーションプログラミングインタフェース
 グルー言語
 名前修飾 
 Comparison of application virtual machines
 Source to source compiler
 SWIG

外部リンク 
 libffi
 Foreign Function Interface

計算機科学
プログラミング