C Интерфейс
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{Type}, по умолчанию 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 этой функции больше недоступен программе, может привести к неопределенному поведению, включая повреждение программы или segfaults, в любое последующее время.
См. также 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. Размеры двух областей должны совпадать.
copyto!(dest::AbstractMatrix, src::UniformScaling)
Копирует UniformScaling в матрицу.
В Julia 1.0 этот метод поддерживал только квадратную матрицу-приёмник. В Julia 1.1 была добавлена поддержка прямоугольной матрицы.
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.
Эта функция не может быть вызвана для неизменяемых объектов, так как у них нет стабильных адресов памяти.
См. также: 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 или runtime Julia, автоматически отключают sigint во время выполнения.
Base.reenable_sigintФункция
reenable_sigint(f::Function)
Возобновить обработчик Ctrl-C во время выполнения функции. Временное обратное действие disable_sigint.
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). Кроме того, для создания внутренних указателей на контейнеры (такие как Array или Ptr), это можно записать как Ref(a, i) для создания ссылки на i-й элемент a.
При передаче в качестве аргумента ccall (как тип Ptr или Ref) объект Ref преобразуется в базовый указатель на данные, к которым он ссылается.
В Julia нет недопустимого (NULL) Ref объекта, но объект C_NULL типа Ptr может быть передан в аргумент ccall Ref.
Использование в распараллеливании
Распараллеливание с объектом Ref(x) рассматривает x как скаляр:
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 завершаются нулём. Для строк в стиле 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, составленных из нативного символьного типа, см. 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.4.2/base/c/