Spec-Zone.ru › Julia 0.7

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).

source

Base.Csize_tТип

Csize_t

Эквивалентен встроенному типу size_t c-типу (UInt).

source

Base.Cssize_tТип

Cssize_t

Эквивалентен встроенному типу ssize_t c-типу.

source

Base.Cptrdiff_tТип

Cptrdiff_t

Эквивалентен встроенному типу ptrdiff_t c-типу (Int).

source

Base.Cwchar_tТип

Cwchar_t

Эквивалентен встроенному типу wchar_t c-типу (Int32).

source

Base.CwstringТип

Cwstring

Строка в стиле C, составленная из символов типа Cwchar_t встроенного типа широкого символа. Такие строки завершаются символом NUL. Для строк в стиле C, составленных из встроенного символьного типа, см. Cstring. Дополнительную информацию об интерпретации строк с C см. в руководстве.

source

Base.CfloatТип

Cfloat

Эквивалентен встроенному типу float c-типу (Float32).

source

Base.CdoubleТип

Cdouble

Эквивалентен встроенному типу double c-типу (Float64).

source

Интерфейс 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 для примеров использования.

source

© 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API