0Pricing
Lua Academy · Урок

Вызов функций C через FFI

Вызывайте функции libc и пользовательских динамических библиотек из Lua без дополнительных накладных расходов.

«Вызов функций C через FFI» — бесплатный урок Lua Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Прямые вызовы функций C

После объявления с помощью ffi.cdef функции C вызываются через объект библиотеки точно так же, как функции Lua. Аргументы и возвращаемые значения преобразуются автоматически.

local ffi = require("ffi")
ffi.cdef[[ double sin(double x); ]]
local m = ffi.load("m")
print(m.sin(math.pi / 2))  -- 1.0

Преобразование типов

По умолчанию числа Lua преобразуются в C double. FFI автоматически преобразует их в объявленный тип параметра C. Логические значения преобразуются в 0/1. Строки преобразуются в const char*.

Вызов printf

printf — вариативная функция C. Вызывайте её через ffi.C.printf, передавая строку формата и аргументы.

ffi.cdef[[ int printf(const char *fmt, ...); ]]
ffi.C.printf("Sum: %d\n", 42)

Обработка возвращаемых значений

Возвращаемые значения C автоматически преобразуются в типы Lua. Целые числа становятся числами Lua, а char* — lightuserdata (используйте ffi.string для преобразования).

ffi.cdef[[ char *getenv(const char *name); ]]
local ptr = ffi.C.getenv("HOME")
if ptr ~= nil then
  print(ffi.string(ptr))
end

ffi.string

ffi.string(ptr, len) преобразует указатель char* в строку Lua. Без len функция читает данные до нулевого байта.

Обработка ошибок

Функции C возвращают коды ошибок или устанавливают errno. Явно проверяйте возвращаемые значения. Получить errno можно через ffi.errno().

ffi.cdef[[ int open(const char *path, int flags); ]]
local fd = ffi.C.open("missing.txt", 0)
if fd < 0 then
  print("Error:", ffi.errno())
end

Аргументы-структуры

Передавайте структуры C по значению или через указатель. Создавайте их с помощью ffi.new.

ffi.cdef[[
  typedef struct { int x, y; } Point;
  void printPoint(Point p);
]]
local p = ffi.new("Point", {x=3, y=4})
lib.printPoint(p)

Аргументы-указатели

Передавайте указатели на выходные данные функциям, которые возвращают несколько значений через параметры-указатели.

ffi.cdef[[
  void minmax(double *arr, int n, double *min, double *max);
]]
local arr = ffi.new("double[5]", {5,2,8,1,9})
local mn, mx = ffi.new("double[1]"), ffi.new("double[1]")
lib.minmax(arr, 5, mn, mx)
print(mn[0], mx[0])

Производительность вызовов FFI

Вызовы функций C через FFI имеют почти нулевые накладные расходы — они значительно быстрее вызовов из Lua в C через традиционный API C. JIT часто может полностью встроить такой вызов.

Вариативные функции

Вариативные функции C (...) необходимо вызывать с правильными типами. При необходимости передавайте явные приведения типов, чтобы избежать неоднозначности.

ffi.C.printf("%d %f\n", ffi.cast("int", 42), ffi.cast("double", 3.14))

Правила безопасности

Всегда проверяйте возвращаемые указатели на NULL. Никогда не передавайте освобождённый указатель или указатель, вышедший из области действия. Используйте ffi.gc, чтобы прикреплять финализаторы к выделенной в C памяти.

Вопрос о вызовах FFI

Как FFI преобразует строку Lua в C const char*?

Итоги: вызов C через FFI

Вызывайте функции C через объект библиотеки так же, как функции Lua. FFI выполняет преобразование типов. Используйте ffi.string для возвращаемых значений char*, ffi.errno() для обработки ошибок и ffi.new для аргументов-структур и массивов.

Часто задаваемые вопросы

Урок «Вызов функций C через FFI» бесплатный?

Да — полный текст урока «Вызов функций C через FFI» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Вызов функций C через FFI»?

Вызывайте функции libc и пользовательских динамических библиотек из Lua без дополнительных накладных расходов. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Вызов функций C через FFI»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы FFI: ffi.cdef и ffi.load
  2. Вызов функций C через FFI
  3. Указатели, структуры и массивы в FFI
  4. Обратные вызовы: передача функций Lua в C
← Назад к Lua Academy