異なるプログラミング言語を混在させることは、長い間私にはよく理解できませんでした。このウィキペディアの記事によると、外部関数インターフェイス (または FFI) はいくつかの方法で実行できます。
- ホスト言語呼び出し可能にするゲスト言語関数を特定の方法で指定または実装することを要求する。多くの場合、ある種の互換性ライブラリを使用します。
- 必要な翻訳を実行する適切なグルー コードでゲスト言語関数を自動的に「ラップ」するツールの使用。
- ラッパー ライブラリの使用
- 言語間で使用できるホスト言語機能のセットを制限します。たとえば、C から呼び出される C++ 関数は、(一般に) 参照パラメーターを含めたり、例外をスローしたりしない場合があります。
私の質問:
1番目、2番目、3番目の方法の違いは何ですか? それらはすべて、呼び出された言語のコードをオブジェクトファイルとヘッダーファイルを含むライブラリにコンパイルし、呼び出し言語によって呼び出されるように思えます。
リンクされているあるソースによると、FFI の実装はいくつかの方法で行うことができます。
- ターゲット言語で呼び出された関数が特定のプロトコルを実装することを要求します。
- 特定の低言語関数を受け取り、それをコードで「ラップ」して、高レベル言語規則との間でデータ変換を行うラッパー ライブラリを実装します。
- 高レベル機能のサブセット (低レベル言語と互換性がある) を使用するために、ネイティブとして宣言された関数を要求する。
リンクされたソースの最初の方法がウィキペディアの最初の方法と同じかどうか疑問に思っていましたか?
このソースの 3 番目の方法はどういう意味ですか? ウィキペディアの4番目の方法に対応していますか?
同じソースで、リストされている 3 つの方法を比較すると、2 つの言語の間のギャップを埋める仕事が、呼び出された言語から呼び出した言語に徐々に移行していると言えます。私はそれをどのように理解するのだろうかと思っていました。この変化は、ウィキペディアの 4 つの方法にも当てはまりますか?
言語バインディングと FFI は同等の概念ですか? それらはどのように関連し、異なるのでしょうか?
プログラミング言語からライブラリまたは OS サービスへのバインディングは、言語でそのサービスを提供する API です。
ウィキペディアまたはソースからの引用で、次の各例がどの方法に属しているのか疑問に思っていましたか?
- 共通オブジェクト リクエスト ブローカ アーキテクチャ (CORBA)
- C++ で extern "C" 宣言を使用して C++ で C を呼び出し、名前マングリングを無効にします。
- MATLAB Interface to Shared Libraries を使用して Matlab で C を呼び出す。つまり、最初に gcc などの一般的な C コンパイラを介して C コードを共有ライブラリにコンパイルし、次に Matlab 関数 loadlibrary()、calllib を介して共有ライブラリをロード、関数の呼び出し、およびアンロードします。 () および unloadlibrary()。
- C/C++ 言語 MEX ファイルを作成して、Matlab で C を呼び出す
- mcc コンパイラーによる C での Matlab の呼び出し
- Java での C++ の呼び出し ( JNIによる) および C++ での Java の呼び出し (これもJNIによる)
- SWIGを使用して、他の言語で C/C++ を呼び出す
- Ctypes moduleを使用して、Python で C を呼び出し ます。
- シトン
- RPyによる Python での R の呼び出し
- Python、Fortran、Java などのさまざまな言語から OpenGL へのプログラミング言語バインディング
- C++、Python、Java、Common Lisp などのさまざまな言語からのCairoなどの C ライブラリのバインディング