Документация Engee

Вызов C кода в Engee

В данной демонстрации изучим возможности использования С кода в скриптах Engee. Ведь, хотя большая часть кода может быть написана на Engee, существует множество высококачественных и зрелых библиотек для численных вычислений, уже написанных на C.

В Engee придерживаются философии «отсутствия шаблонов»: можно вызывать функции непосредственно из скрипта без какого-либо «связующего» кода, генерации кода или компиляции.

Это достигается вызовом макроса @ccall.

В качестве примера вызовем функцию clock из стандартной библиотеки C. Clock не принимает аргументов, и в нашем случае возвращает Int32.

t = @ccall clock()::Int32
print("Тип t: " * string(typeof(t)) * ", при t равном: " * string(t))
Тип t: Int32, при t равном: 365356426

Теперь рассмотрим вариант вызова функции, написанной на языке С. Для этого возьмем файл с функцией, написанной на С, и соберем из него исполняемый файл .so.

Для этого перейдём в командную строку Engee, включим строку shell при помощи точки с запятой и выполним следующие команды.

cd /user/start/examples/integrated_languages/calling_c_code

gcc -c -fPIC say_y.c -o say_y.o

gcc say_y.o -shared -o say_y.so

Ниже представлен скриншот выполнения этого действия.

image.png

Сама функция на языке C очень простая: она выводит входной аргумент. На скриншоте ниже показан код функции.

image.png

Для вызова функции нам необходимо указать путь до собранного файла .so и вызвать саму функцию.

@ccall "$(@__DIR__)/say_y.so".say_y(10::Cint)::Cvoid
Введён: y = 10.

Вывод

В данной демонстрации мы разобрали возможности Engee в плане применения С, как за счёт вызова функций внутри скрипта, так и за счёт подключения пользовательских функций для выполнения поставленных перед нами задач.