Julia の呼び出し規約

Julia は四つの異なる用途に応じて三つの呼び出し規約を使い分けます:

規約の名前 接頭辞 用途
Native julia_ 特殊化されたシグネチャを使った高速な呼び出し
JL Call jlcall_ 汎用な呼び出しのラッパー
JL Call jl_ 組み込み関数
C ABI jlcapi_ C から呼び出し可能なラッパー

Native 呼び出し規約

Native 呼び出し規約は汎用でない高速な関数呼び出しのために設計されています。通常は特殊化されたシグネチャが使われます。

小さな返り値は LLVM の返り値として返ります。大きな返り値は “構造体リターン” (sret) を通して返ります (呼び出し側が返り値のスロットを提供します)。

引数または返り値が同じ型からなるタプルの場合には、それは LLVM 配列ではなく LLVM ベクトルで表現されることもあります。

JL Call 呼び出し規約

JL Call 呼び出し規約は組み込み関数と汎用的なディスパッチで使われます。この規約を使う関数を手で書くときは JL_CALLABLE マクロを使って宣言されます。この規則では必ず次の三つのパラメータが使われます:

返り値はボックスを指すポインタです。

C ABI

C ABI ラッパーは C から Julia を呼び出すためにあります。このラッパーはネイティブの呼び出し規約を使って関数を呼び出します。

タプルは必ず C 配列として表現されます。