C Интерфейс
ccallКлючевое слово
ccall((function_name, library), returntype, (argtype1, ...), argvalue1, ...) ccall(function_pointer, returntype, (argtype1, ...), argvalue1, ...)
Вызов функции в выводимой на C разделяемой библиотеке, указанной кортежем (function_name, library), где каждый компонент — это строка или символ. В качестве альтернативы, 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{Type}, по умолчанию Ptr{Cvoid}, если аргумент Type не указан. Значения можно читать или записывать с помощью unsafe_load или unsafe_store! соответственно.
Base.@cfunctionМакрос
@cfunction(callable, ReturnType, (ArgumentTypes...,)) -> Ptr{Cvoid}
@cfunction($callable, ReturnType, (ArgumentTypes...,)) -> CFunction
Генерация указателя на функцию, вызываемую с C, из функции Julia closure для заданной подписи типа. Чтобы передать возвращаемое значение в 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 этой функции больше недоступен для программы, может привести к неопределённому поведению, включая повреждение программы или segfault, в любое последующее время.
См. также cconvert
Base.cconvertФункция
cconvert(T,x)
Преобразование x в значение для передачи в C-код как тип T, обычно вызывая convert(T, x).
В случаях, когда x не может быть безопасно преобразован в T, в отличие от convert, cconvert может вернуть объект другого типа, чем T, но подходящий для unsafe_convert для обработки. Результат этой функции должен оставаться допустимым (для сборки мусора) до тех пор, пока результат unsafe_convert больше не нужен. Это можно использовать для выделения памяти, к которой будет обращаться ccall. Если необходимо выделить несколько объектов, в качестве возвращаемого значения можно использовать кортеж из объектов.
Ни 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, 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 существует, пока используется этот указатель. Макрос GC.@preserve должен использоваться для защиты аргумента array от сбора мусора в заданном блоке кода.
Вызов 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 будет использоваться.
Эта функция не может быть вызвана для неизменяемых объектов, так как они не имеют стабильных адресов памяти.
исходный код
Base.unsafe_pointer_to_objrefФункция
unsafe_pointer_to_objref(p::Ptr)
Преобразование Ptr в ссылку на объект. Предполагается, что указатель ссылается на действительный объект Julia, выделенный в куче. Если это не так, результатом будет неопределённое поведение, поэтому эта функция считается «небезопасной» и должна использоваться с осторожностью.
Base.disable_sigintФункция
disable_sigint(f::Function)
Отключение обработчика Ctrl-C во время выполнения функции на текущем задании для вызова внешнего кода, который может вызвать код Julia, не защищённый от прерываний. Предполагается вызывать с использованием синтаксиса блока do следующим образом:
disable_sigint() do
# interrupt-unsafe code
...
end
Это не требуется на рабочих потоках (Threads.threadid() != 1), так как InterruptException будет доставлен только в главный поток. Внешние функции, которые не вызывают код Julia или Julia Runtime, автоматически отключают sigint во время своего выполнения.
Base.reenable_sigintФункция
reenable_sigint(f::Function)
Восстановление обработчика Ctrl-C во время выполнения функции. Временное отключение действия disable_sigint.
Base.systemerrorФункция
systemerror(sysfunc, iftrue)
Вызывает SystemError для errno с описательной строкой sysfunc, если iftrue равно true
Core.PtrТип
Ptr{T}
Адрес памяти, ссылающийся на данные типа T. Однако нет гарантии, что память действительна или что она действительно представляет данные указанного типа.
Core.RefТип
Ref{T}
Объект, который безопасно ссылается на данные типа T. Этот тип гарантирует, что он указывает на действительную, выделенную Julia память правильного типа. Данные защищены от освобождения сборщиком мусора до тех пор, пока на сам Ref есть ссылка.
В Julia объекты Ref обращаются с помощью [].
Создание Ref для значения x типа T обычно записывается как Ref(x). Кроме того, для создания внутренних указателей на контейнеры (такие как Array или Ptr) можно записать Ref(a, i) для создания ссылки на i-й элемент a.
При передаче как аргумент ccall (как Ptr или Ref тип) объект Ref будет преобразован в нативный указатель на данные, к которым он ссылается.
В Julia нет недопустимых (NULL) Ref, но экземпляр C_NULL типа Ptr может быть передан в аргумент ccall Ref.
Base.CcharТип
Cchar
Эквивалент нативному типу C char.
Base.CucharТип
Cuchar
Эквивалент нативному типу C unsigned char (UInt8).
Base.CshortТип
Cshort
Эквивалент нативному типу C signed short (Int16).
Base.CstringТип
Cstring
Строка в стиле C, состоящая из нативных символов типа Cchar. Строки в стиле C завершаются нулём. Для строк в стиле C, составленных из нативных широких символов, см. Cwstring. Дополнительную информацию об обмене строками с C см. в руководстве.
Base.CushortТип
Cushort
Эквивалент нативному типу C unsigned short (UInt16).
Base.CintТип
Cint
Эквивалент нативному типу C signed int (Int32).
Base.CuintТип
Cuint
Эквивалент нативному типу C unsigned int (UInt32).
Base.ClongТип
Clong
Эквивалент нативному типу C signed long.
Base.CulongТип
Culong
Эквивалент нативному типу C unsigned long.
Base.ClonglongТип
Clonglong
Эквивалент нативному типу C signed long long (Int64).
Base.CulonglongТип
Culonglong
Эквивалент нативному типу C unsigned long long (UInt64).
Base.Cintmax_tТип
Cintmax_t
Эквивалент нативному типу C intmax_t (Int64).
Base.Cuintmax_tТип
Cuintmax_t
Эквивалент нативному типу C uintmax_t (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 встроенного типа широкого символа. Такие строки завершаются символом 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 и т. д.).
Необязательная строка объявлений содержит объявления внешних функций, необходимые для компиляции строки IR в LLVM. Несколько объявлений могут быть переданы, разделяя их символами перевода строки.
Обратите внимание, что кортеж типов аргументов должен быть литеральным кортежем, а не кортежем-переменной или выражением.
Каждый ArgumentValue по llvmcall будет преобразован в соответствующий ArgumentType, путем автоматической вставки вызовов unsafe_convert(ArgumentType, cconvert(ArgumentType, ArgumentValue)). (См. также документацию для unsafe_convert и cconvert для получения дополнительной информации.) В большинстве случаев это просто приводит к вызову convert(ArgumentType, ArgumentValue).
См. test/llvmcall.jl для примеров использования.
© 2009–2019 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v0.7.0/base/c/