Соглашения о вызовах

Julia использует три соглашения о вызовах для четырех различных целей:

Название Префикс Назначение

Собственное

julia_

Скорость за счет специализированных сигнатур

JL Call

jlcall_

Оболочка для универсальных вызовов

JL Call

jl_

Встроенные функции

C ABI

jlcapi_

Оболочка, вызываемая из C

Собственное соглашение о вызовах Julia

Собственное соглашение о вызовах предназначено для быстрых неуниверсальных вызовов. Как правило, оно использует специализированную сигнатуру.

*Фантомные экземпляры LLVM (типы нулевой длины) опускаются. *Скаляры и векторы LLVM передаются по значению. *Агрегаты LLVM (массивы и структуры) передаются по ссылке.

Небольшое возвращаемое значение возвращается как возвращаемые значение LLVM. Большие возвращаемые значения возвращаются по соглашению «возврат структуры» (sret), где вызывающая сторона предоставляет указатель на слот возврата.

Аргумент или возвращаемые значения, которые являются однородным кортежем, иногда представляются как вектор LLVM вместо массива LLVM.

Соглашение JL Call

Соглашение JL Call предназначено для встроенных модулей и общей диспетчеризации. Рукописные функции, использующие это соглашение, объявляются с помощью макроса JL_CALLABLE. В соглашении используется ровно три параметра:

*F — представление в Julia применяемой функции *args — указатель на массив указателей на кучи *nargs — длина массива.

Возвращаемое значение — указатель на кучу.

C ABI

Оболочки C ABI позволяют вызывать Julia из C. Оболочка вызывает функцию, используя собственное соглашение о вызовах.

Кортежи всегда представляются в виде массивов C.