C Интерфейс
Base.@ccallМакрос
@ccall library.function_name(argvalue1::argtype1, ...)::returntype @ccall function_name(argvalue1::argtype1, ...)::returntype @ccall $function_pointer(argvalue1::argtype1, ...)::returntype
Вызов функции в C-экспортированной динамической библиотеке, заданной library.function_name, где library — строковая константа или литерал. Библиотека может быть опущена, в этом случае function_name разрешается в текущем процессе. В качестве альтернативы, @ccall также может использоваться для вызова указателя на функцию $function_pointer, например, возвращённого dlsym.
Каждый argvalue до @ccall преобразуется в соответствующий argtype, посредством автоматической вставки вызовов unsafe_convert(argtype, cconvert(argtype, argvalue)). (См. также документацию для unsafe_convert и cconvert для более подробной информации.) В большинстве случаев это просто приводит к вызову convert(argtype, argvalue).
Примеры
@ccall strlen(s::Cstring)::Csize_t
Это вызывает функцию стандартной C-библиотеки:
size_t strlen(char *)
с использованием переменной Julia с именем s. См. также ccall.
Поддержка аргументов с переменным числом параметров осуществляется с использованием следующей конвенции:
@ccall printf("%s = %d"::Cstring ; "foo"::Cstring, foo::Cint)::Cint
Точка с запятой используется для разделения обязательных аргументов (которых должно быть как минимум один) от аргументов с переменным числом параметров.
Пример использования внешней библиотеки:
# C signature of g_uri_escape_string: # char *g_uri_escape_string(const char *unescaped, const char *reserved_chars_allowed, gboolean allow_utf8); const glib = "libglib-2.0" @ccall glib.g_uri_escape_string(my_uri::Cstring, ":/"::Cstring, true::Cint)::Cstring
Если необходимо, строковый литерал также может быть использован непосредственно перед именем функции "libglib-2.0".g_uri_escape_string(...
ccallКлючевое слово
ccall((function_name, library), returntype, (argtype1, ...), argvalue1, ...) ccall(function_name, returntype, (argtype1, ...), argvalue1, ...) ccall(function_pointer, returntype, (argtype1, ...), argvalue1, ...)
Вызов функции в C-экспортированной динамической библиотеке, заданной кортежем (function_name, library), где каждый компонент — строка или символ. Вместо указания библиотеки, можно также использовать символ или строку function_name, который разрешается в текущем процессе. В качестве альтернативы, ccall также может использоваться для вызова указателя на функцию function_pointer, например, возвращённого dlsym.
Обратите внимание, что кортеж типов аргументов должен быть литеральным кортежем, а не кортежем, являющимся переменной или выражением.
Каждый argvalue до ccall будет преобразован в соответствующий argtype, посредством автоматической вставки вызовов unsafe_convert(argtype, cconvert(argtype, argvalue)). (См. также документацию для unsafe_convert и cconvert для более подробной информации.) В большинстве случаев это просто приводит к вызову convert(argtype, argvalue).
Core.Intrinsics.cglobalФункция
cglobal((symbol, library) [, type=Cvoid])
Получение указателя на глобальную переменную в C-экспортированной динамической библиотеке, заданной точно так же, как в ccall. Возвращает указатель, по умолчанию Ptr{Cvoid} если аргумент Type не указан. Значения могут быть прочитаны или записаны с помощью unsafe_load или unsafe_store!, соответственно.
Base.@cfunctionМакрос
@cfunction(callable, ReturnType, (ArgumentTypes...,)) -> Ptr{Cvoid}
@cfunction($callable, ReturnType, (ArgumentTypes...,)) -> CFunction
Генерация указателя на C-вызываемую функцию из функции Julia callable для заданной сигнатуры типа. Для передачи возвращаемого значения в ccall, используйте тип аргумента Ptr{Cvoid} в сигнатуре.
Обратите внимание, что кортеж типов аргументов должен быть литеральным кортежем, а не кортежем, являющимся переменной или выражением (хотя он может содержать операцию splat). И что эти аргументы будут оценены в глобальной области видимости во время компиляции (а не отложены до выполнения). Добавление '$' перед аргументом функции изменяет это, чтобы вместо этого создать замыкание во время выполнения над локальной переменной callable (это не поддерживается на всех архитектурах).
См. раздел руководства по использованию ccall и cfunction.
Примеры
julia> function foo(x::Int, y::Int)
return x + y
end
julia> @cfunction(foo, Int, (Int, Int))
Ptr{Cvoid} @0x000000001b82fcd0
исходный код
Base.CFunctionТип
CFunction struct
Дескриптор для управления возвращаемым значением из @cfunction при аннотации первого аргумента с помощью '$'. Как и все дескрипторы cfunction, он должен передаваться в ccall в качестве Ptr{Cvoid}, и будет автоматически преобразован в вызываемом месте в соответствующий тип.
См. @cfunction.
Base.unsafe_convertФункция
unsafe_convert(T, x)
Преобразование x в C-аргумент типа T, где входной x должен быть возвращаемым значением cconvert(T, ...).
В случаях, когда convert потребовалось бы взять объект Julia и преобразовать его в Ptr, следует использовать эту функцию для определения и выполнения этого преобразования.
Следует быть внимательным, чтобы убедиться, что ссылка Julia на x существует, пока результат этой функции будет использоваться. Соответственно, аргумент x этой функции никогда не должен быть выражением, только именем переменной или ссылкой на поле. Например, x=a.b.c допустимо, но x=[a,b,c] нет.
Префикс unsafe этой функции указывает, что использование результата этой функции после того, как аргумент x этой функции больше недоступен программе, может привести к неопределённому поведению, включая повреждение программы или сегментные нарушения, в любое последующее время.
См. также cconvert
Base.cconvertФункция
cconvert(T,x)
Преобразование x в значение для передачи в C-код как тип T, обычно вызывая convert(T, x).
В случаях, когда x не может быть безопасно преобразован в T, в отличие от convert, cconvert может вернуть объект типа, отличного от T, который, однако, подходит для unsafe_convert для обработки. Результат этой функции должен оставаться действительным (для сборки мусора) до тех пор, пока результат unsafe_convert больше не нужен. Это может быть использовано для выделения памяти, которая будет использоваться C-кодом. Если необходимо выделить несколько объектов, в качестве возвращаемого значения можно использовать кортеж из объектов.
Ни convert ни cconvert не должны принимать объект Julia и преобразовывать его в Ptr.
Base.unsafe_loadФункция
unsafe_load(p::Ptr{T}, i::Integer=1)
Загрузка значения типа T из адреса i-го элемента (индексируется с 1) начиная с p. Это эквивалентно C-выражению p[i-1].
Префикс unsafe этой функции указывает, что никакая валидация не выполняется для указателя p для проверки его корректности. Некорректное использование может привести к сегментной ошибке или возвращению мусорных данных, аналогично C.
Base.unsafe_store!Функция
unsafe_store!(p::Ptr{T}, x, i::Integer=1)
Сохранение значения типа T по адресу i-го элемента (индексируется с 1) начиная с p. Это эквивалентно C-выражению p[i-1] = x.
Префикс unsafe этой функции указывает, что никакая валидация не выполняется для указателя p для проверки его корректности. Некорректное использование может привести к повреждению или сегментной ошибке программы, аналогично C.
Base.unsafe_copyto!Метод
unsafe_copyto!(dest::Ptr{T}, src::Ptr{T}, N)
Копирование N элементов из исходного указателя в целевой, без проверок. Размер элемента определяется типом указателей.
Префикс unsafe этой функции указывает, что никакая валидация не выполняется для указателей dest и src для проверки их корректности. Некорректное использование может привести к повреждению или сегментной ошибке программы, аналогично C.
Base.unsafe_copyto!Метод
unsafe_copyto!(dest::Array, do, src::Array, so, N)
Копирование N элементов из исходного массива в целевой, начиная со смещения so в источнике и do в назначении (индексируется с 1).
Префикс unsafe этой функции указывает, что никакая валидация не выполняется для проверки того, что N находится в границах массива. Некорректное использование может привести к повреждению или сегментной ошибке программы, аналогично C.
Base.copyto!Функция
copyto!(dest::AbstractMatrix, src::UniformScaling)
Копирует UniformScaling на матрицу.
В Julia 1.0 этот метод поддерживал только квадратную целевую матрицу. Julia 1.1. добавила поддержку прямоугольной матрицы.
copyto!(dest, do, src, so, N)
Копирует N элементы из коллекции src, начиная с смещения so, в массив dest, начиная со смещения do. Возвращает dest.
copyto!(dest::AbstractArray, src) -> dest
Копирует все элементы из коллекции src в массив dest, длина которого должна быть больше или равна длине n коллекции src. Первые n элементов dest перезаписываются, остальные остаются без изменений.
Примеры
julia> x = [1., 0., 3., 0., 5.];
julia> y = zeros(7);
julia> copyto!(y, x);
julia> y
7-element Array{Float64,1}:
1.0
0.0
3.0
0.0
5.0
0.0
0.0
исходный кодcopyto!(dest, Rdest::CartesianIndices, src, Rsrc::CartesianIndices) -> dest
Копирует блок src в диапазоне Rsrc в блок dest в диапазоне Rdest. Размеры двух областей должны совпадать.
Base.pointerФункция
pointer(array [, index])
Получение физического адреса массива или строки, необязательно в заданном месте index.
Эта функция "небезопасна". Убедитесь, что ссылка Julia на array существует до тех пор, пока используется этот указатель. Для защиты аргумента array от сборки мусора внутри заданного блока кода следует использовать макрос GC.@preserve.
Вызов Ref(array[, index]) обычно предпочтительнее, так как он гарантирует корректность.
Base.unsafe_wrapМетод
unsafe_wrap(Array, pointer::Ptr{T}, dims; own = false)
Оборачивание объекта Julia Array вокруг данных по адресу pointer, без копирования. Тип элемента указателя T определяет тип элемента массива. dims — это либо целое число (для одномерного массива), либо кортеж размерностей массива. own необязательно указывает, должна ли Julia взять на себя ответственность за память, вызвав free для указателя, когда массив больше не используется.
Функция помечена как "небезопасная", так как она вызовет ошибку, если pointer не является допустимым адресом памяти для данных заданной длины.
Base.pointer_from_objrefФункция
pointer_from_objref(x)
Получение адреса памяти объекта Julia как Ptr. Существование полученного Ptr не защищает объект от сборки мусора, поэтому вы должны гарантировать, что объект остается сохранённым в течение всего времени использования Ptr.
Данная функция не может быть вызвана для неизменяемых объектов, так как у них нет стабильных адресов памяти.
См. также: unsafe_pointer_to_objref.
Base.unsafe_pointer_to_objrefФункция
unsafe_pointer_to_objref(p::Ptr)
Преобразование Ptr в ссылку на объект. Предполагается, что указатель ссылается на допустимый выделенный в куче объект Julia. В противном случае результат непредсказуем, поэтому эта функция считается "небезопасной" и должна использоваться с осторожностью.
См. также: pointer_from_objref.
Base.disable_sigintФункция
disable_sigint(f::Function)
Отключение обработчика Ctrl-C во время выполнения функции на текущей задаче для вызова внешнего кода, который может вызвать код Julia, не защищённый от прерываний. Предназначен для вызова с использованием синтаксиса блока do следующим образом:
disable_sigint() do
# interrupt-unsafe code
...
end
Это не нужно на рабочих потоках (Threads.threadid() != 1), так как InterruptException будет доставлен только главному потоку. Внешние функции, которые не вызывают код Julia или движок Julia, автоматически отключают sigint во время своего выполнения.
Base.reenable_sigintФункция
reenable_sigint(f::Function)
Восстановление обработчика Ctrl-C во время выполнения функции. Временно отменяет действие disable_sigint.
Base.exit_on_sigintФункция
exit_on_sigint(on::Bool)
Устанавливает флаг exit_on_sigint среды выполнения Julia. Если false, Ctrl-C (SIGINT) обрабатывается как InterruptException в try блоке. Это поведение по умолчанию в REPL, любой код, запущенный через -e и -E, а также в скриптах Julia, запущенных с -i параметром.
Если true, InterruptException не генерируется при Ctrl-C. Для выполнения кода при таком событии требуется atexit. Это поведение по умолчанию в скриптах Julia, запущенных без -i параметра.
Функция exit_on_sigint требует как минимум Julia 1.5.
Base.systemerrorФункция
systemerror(sysfunc[, errno::Cint=Libc.errno()]) systemerror(sysfunc, iftrue::Bool)
Возбуждает SystemError для errno с описательной строкой sysfunc, если iftrue равно true
Base.windowserrorФункция
windowserror(sysfunc[, code::UInt32=Libc.GetLastError()]) windowserror(sysfunc, iftrue::Bool)
Аналогично systemerror, но для функций API Windows, которые используют GetLastError для возвращения кода ошибки вместо установки errno.
Core.PtrТип
Ptr{T}
Адрес памяти, ссылающийся на данные типа T. Однако нет гарантии, что память действительно допустима или что она действительно представляет данные указанного типа.
Core.RefТип
Ref{T}
Объект, который безопасно ссылается на данные типа T. Этот тип гарантирует указание на действительную, выделенную Julia память правильного типа. Подлежащие данные защищены от освобождения сборщиком мусора, пока сама ссылка Ref активна.
В Julia объекты Ref разыменовываются (загружаются или сохраняются) с помощью [].
Создание ссылки Ref на значение x типа T обычно записывается как Ref(x). Дополнительно, для создания внутренних указателей на контейнеры (такие как массив или указатель), можно записать Ref(a, i) для создания ссылки на i-й элемент a.
При передаче в качестве аргумента ccall (либо как Ptr, либо Ref тип) объект Ref будет преобразован в собственный указатель на данные, на которые он ссылается.
В Julia нет недопустимого (NULL) Ref, но объект C_NULL типа Ptr может быть передан в аргумент ccall Ref.
Использование в широковещательной передаче
Ref иногда используется в широковещательной передаче, чтобы рассматривать ссылаемые значения как скалярные:
julia> isa.(Ref([1,2,3]), [Array, Dict, Int])
3-element BitArray{1}:
1
0
0
исходный код
Base.CcharТип
Cchar
Эквивалентно встроенному char типу c.
Base.CucharТип
Cuchar
Эквивалентно встроенному unsigned char типу c (UInt8).
Base.CshortТип
Cshort
Эквивалентно встроенному signed short типу c (Int16).
Base.CstringТип
Cstring
Строка в стиле C, составленная из типов символов Cchar. Такие строки в C завершаются символом NUL. Для строк в стиле C, составленных из встроенного типа широких символов, см. Cwstring. Дополнительную информацию об обмене строками с C см. в справочнике.
Base.CushortТип
Cushort
Эквивалентно встроенному unsigned short типу c (UInt16).
Base.CintТип
Cint
Эквивалентно встроенному signed int типу c (Int32).
Base.CuintТип
Cuint
Эквивалентно встроенному unsigned int типу c (UInt32).
Base.ClongТип
Clong
Эквивалентно встроенному signed long типу c.
Base.CulongТип
Culong
Эквивалентно встроенному unsigned long типу c.
Base.ClonglongТип
Clonglong
Эквивалентно встроенному signed long long типу c (Int64).
Base.CulonglongТип
Culonglong
Эквивалентно встроенному unsigned long long типу c (UInt64).
Base.Cintmax_tТип
Cintmax_t
Эквивалентно встроенному intmax_t типу c (Int64).
Base.Cuintmax_tТип
Cuintmax_t
Эквивалентно встроенному uintmax_t типу c (UInt64).
Base.Csize_tТип
Csize_t
Эквивалентно встроенному size_t типу c (UInt).
Base.Cssize_tТип
Cssize_t
Эквивалентно встроенному ssize_t типу c.
Base.Cptrdiff_tТип
Cptrdiff_t
Эквивалентно встроенному ptrdiff_t типу c (Int).
Base.Cwchar_tТип
Cwchar_t
Эквивалентно встроенному wchar_t типу c (Int32).
Base.CwstringТип
Cwstring
Строка в стиле C, составленная из встроенного типа широких символов Cwchar_t. Такие строки в C завершаются символом NUL. Для строк в стиле C, составленных из встроенного типа символов, см. Cstring. Дополнительную информацию об обмене строками с C см. в справочнике.
Base.CfloatТип
Cfloat
Эквивалентно встроенному float типу c (Float32).
Base.CdoubleТип
Cdouble
Эквивалентно встроенному double типу c (Float64).
Интерфейс LLVM
Core.Intrinsics.llvmcallФункция
llvmcall(IR::String, ReturnType, (ArgumentType1, ...), ArgumentValue1, ...) llvmcall((declarations::String, IR::String), ReturnType, (ArgumentType1, ...), ArgumentValue1, ...)
Вызов LLVM IR-строки в первом аргументе. Аналогично блоку LLVM-функции define, аргументы доступны как последовательные безымянные переменные SSA (%0, %1 и т. д.).
Необязательная строка объявлений содержит объявления внешних функций, необходимые для компиляции LLVM IR-строки. Несколько объявлений можно передать, разделяя их переводами строк.
Обратите внимание, что кортеж типа аргументов должен быть литеральным кортежем, а не кортежем-переменной или выражением.
Каждый ArgumentValue по llvmcall будет преобразован в соответствующий ArgumentType, путем автоматического вставки вызовов unsafe_convert(ArgumentType, cconvert(ArgumentType, ArgumentValue)). (См. также документацию по unsafe_convert и cconvert для получения более подробной информации.) В большинстве случаев это приводит к вызову convert(ArgumentType, ArgumentValue).
См. test/llvmcall.jl для примеров использования.
© 2009–2020 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.5.3/base/c/