Calling Conventions

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

NamePrefixPurpose
Nativejulia_Speed via specialized signatures
JL Calljlcall_Wrapper for generic calls
JL Calljl_Builtins
C ABIjlcapi_Wrapper callable from C

Julia Native Calling Convention

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

  • Призраки LLVM (типы нулевой длины) опущены.
  • Скалярные значения и векторы LLVM передаются по значению.
  • LLVM агрегаты (массивы и структуры) передаются по ссылке.

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

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

JL Call Convention

Конвенция вызова JL предназначена для встроенных функций и универсальной диспетчеризации. Функции, написанные вручную с использованием этой конвенции, объявляются с помощью макроса JL_CALLABLE. Конвенция использует ровно 3 параметра:

  • F - представление функции Julia, которая применяется
  • args - указатель на массив указателей на коробки
  • nargs - длина массива

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

C ABI

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

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