FFI
このドキュメントは、Wave言語における外部で実装された関数を呼び出すためのFFI(外国機能インターフェース)規格を説明します。 FFIを介して、Waveプログラムは他の言語で書かれたネイティブライブラリと直接連携することができます。
概要
WaveのFFIは宣言ベースで動作します。 外部関数はWaveコードで実装されず、該当する関数がどのABI(アプリケーションバイナリインターフェース)に従うのかを明示するだけです。 実際の実装はリンク段階で外部ライブラリから解決されます。
FFIはコンパイル時に関数の存在のみを宣言し、実行ファイル生成時にリンカが実際のシンボルを接続する方法で動作します。
extern宣言
外部関数はexternキーワードを使用して宣言します。 すべての外部関数宣言にはABI指定が必須です。
extern(abi) fun 関数名(引数...) -> 返却型;
ABI指定
extern宣言には必ずABIを明示しなければなりません。
ABIは外部関数がどの呼び出し規約とシンボル規則に従うかを示します。
extern(c) fun printf(fmt: ptr<u8>);
extern(rust) fun rust_func(i32);
ABIは識別子として扱われ、言語の観点で特定のABIをデフォルトとして提供しません。 すべての外部関数は明示的にABIを指定しなければなりません。
関数単位のextern宣言
外部関数を1つ宣言する場合は次のように書きます。
extern(c) fun InitWindow(width: i32, height: i32, title: ptr<u8>);
この宣言は、C ABIに従うInitWindowシンボルが外部ライブラリーに存在することを意味します。
ブロック単位のextern宣言
同じABIを使用する外部関数が複数ある場合、ブロック形式でまとめて宣言することができます。
extern(c) {
fun InitWindow(width: i32, height: i32, title: ptr<u8>);
fun CloseWindow();
fun BeginDrawing();
fun EndDrawing();
}