Julia の呼び出し規約
Julia は四つの異なる用途に応じて三つの呼び出し規約を使い分けます:
規約の名前 | 接頭辞 | 用途 |
---|---|---|
Native | julia_ |
特殊化されたシグネチャを使った高速な呼び出し |
JL Call | jlcall_ |
汎用な呼び出しのラッパー |
JL Call | jl_ |
組み込み関数 |
C ABI | jlcapi_ |
C から呼び出し可能なラッパー |
Native 呼び出し規約
Native 呼び出し規約は汎用でない高速な関数呼び出しのために設計されています。通常は特殊化されたシグネチャが使われます。
- LLVM ゴースト (長さゼロの型) は無視されます。
- LLVM スカラーとベクトルは値で渡されます。
- LLVM アグリゲート (配列と構造体) は参照で渡されます。
小さな返り値は LLVM の返り値として返ります。大きな返り値は "構造体リターン" (sret
) を通して返ります (呼び出し側が返り値のスロットを提供します)。
引数または返り値が同じ型からなるタプルの場合には、それは LLVM 配列ではなく LLVM ベクトルで表現されることもあります。
JL Call 呼び出し規約
JL Call 呼び出し規約は組み込み関数と汎用的なディスパッチで使われます。この規約を使う関数を手で書くときは JL_CALLABLE
マクロを使って宣言されます。この規則では必ず次の三つのパラメータが使われます:
F
: 適用されている関数の Julia 表現args
: ボックスを指すポインタの配列を指すポインタnargs
:args
が指す配列の長さ
返り値はボックスを指すポインタです。
C ABI
C ABI ラッパーは C から Julia を呼び出すためにあります。このラッパーはネイティブの呼び出し規約を使って関数を呼び出します。
タプルは必ず C 配列として表現されます。