他言語関数インターフェース

提供: langdev
移動: 案内検索

自分で作った言語から、他の言語のライブラリを呼びたい。 既存のライブラリが無いと何もできないので、いろいろあると便利。

ネイティブコード[編集]

SWIG[編集]

CまたはC++のソースコードを読んで、対象言語のライブラリを自動生成してくれる。

http://www.swig.org/

作っているのが静的な言語ならぜひ使いたい。

一方で、SWIGの自分言語用バインディングを自分言語に添付するときは、GPLに注意。

誰か対応言語の追加の仕方のチュートリアルを作ってください。

Ruby ffiは後述のlibffiを使うが、 同時に、SWIGの中間XMLをlibffiを使うコードに変換するffi-swig-generatorも存在する。 ffi-swig-generatorは、swigと動的にも静的にもリンクされないため、GPL汚染される事はない。


libffi[編集]

Cで、関数ポインタ、返り値と引数の型、引数を元に関数を呼び出してくれるライブラリ。

http://www.sourceware.org/libffi/

かなり便利。

動的な言語で使う場合、引数の型チェックしないと未定義動作になるので危険かも。

返り値の型がアライメントされている必要がある。 つまり、ffi_arg型よりサイズの小さい型を返す関数を呼ぶ場合は、 ffi_arg型でメモリを確保し、そこに返り値を一旦格納した後、 そこから取り出すようにする。 はまるので注意。

MITスタイルライセンスなので、GPLじゃない処理系にも安心


拡張ライブラリ[編集]

例えば、Rubyの拡張ライブラリをCで書いた時、そのCからは任意のCライブラリが呼べる。

作るのがめんどい。

VM[編集]

JNI[編集]

JNIのライブラリを使ったCのコードをJavaVMにくっつけてJavaから呼ぶ。 上の「拡張ライブラリ」と同じ

P/Invoke[編集]

Cの関数をC#から呼ぶ。 Cの関数宣言をC#上にDllImportアノテーション付きで書いてやると、それがそのままC#から呼べる。 Win32APIを呼ぶのに便利。