Calling Conventions
Джулия использует три соглашения о вызовах для четырех различных целей:
Name | Prefix | Purpose |
---|---|---|
Native | julia_ | Speed via specialized signatures |
JL Call | jlcall_ | Wrapper for generic calls |
JL Call | jl_ | Builtins |
C ABI | jlcapi_ | 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.