Основы FFI: ffi.cdef и ffi.load
Объявляйте типы C и загружайте динамические библиотеки с помощью модуля ffi LuaJIT.
«Основы FFI: ffi.cdef и ffi.load» — бесплатный урок Lua Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Что такое FFI
FFI (Foreign Function Interface) в LuaJIT позволяет напрямую вызывать функции библиотек C и использовать структуры данных C из Lua без написания кода-обёртки на C.
Подключение FFI
Загрузите библиотеку FFI с помощью require("ffi"). Она встроена в LuaJIT и недоступна в стандартном PUC Lua.
local ffi = require("ffi")ffi.cdef: объявление типов C
ffi.cdef(cDeclarations) разбирает объявления C и делает типы и сигнатуры функций доступными для FFI. Фактическая компиляция кода не выполняется — сохраняется только информация о типах.
ffi.cdef[[
int printf(const char *fmt, ...);
double sqrt(double x);
typedef struct { int x; int y; } Point;
]]ffi.load: загрузка общей библиотеки
ffi.load(libname) загружает общую библиотеку и возвращает объект, поля которого соответствуют объявленным функциям C.
local C = ffi.C -- access to libc on POSIX
local m = ffi.load("m") -- libm
print(m.sqrt(2.0)) -- 1.414...Прямой доступ к функциям libc
В системах POSIX ffi.C предоставляет доступ ко всем стандартным функциям библиотеки C без явной загрузки.
ffi.cdef[[ int puts(const char *s); ]]
ffi.C.puts("Hello from C!")Путь для ffi.load
Передайте полный путь или стандартное имя библиотеки. В Linux используйте "m" для libm.so, "pthread" для pthreads и т. д.
Объявление структур
Объявите структуры C в cdef, затем выделяйте память под них и обращайтесь к ним из Lua.
ffi.cdef[[
typedef struct { float x, y, z; } Vec3;
]]
local v = ffi.new("Vec3", {1, 2, 3})
print(v.x, v.y, v.z) -- 1.0 2.0 3.0Аннотации типов и квалификаторы
cdef поддерживает const, unsigned, int32_t, uint64_t и другие стандартные типы C.
Несколько вызовов cdef
Можно вызывать ffi.cdef несколько раз. Повторные объявления игнорируются. Обычно объявления группируют по библиотекам.
Различия между платформами
Разметка структур и сигнатуры функций могут различаться в зависимости от платформы (Windows и Linux, 32- и 64-разрядные системы). Используйте ffi.os и ffi.arch, чтобы условно объявлять правильные сигнатуры.
Примечание о безопасности
FFI обходит проверку типов Lua. Неправильные объявления C приводят к повреждению памяти, аварийному завершению или неопределённому поведению. Всегда сверяйте объявления с фактическим заголовочным файлом C.
Вопрос об основах FFI
Что делает ffi.cdef?
Итоги: основы FFI
Используйте ffi.cdef для объявления типов и функций C, а ffi.load — для загрузки общих библиотек. ffi.C предоставляет прямой доступ к libc. Всегда проверяйте соответствие объявлений фактическим заголовочным файлам C, чтобы избежать повреждения памяти.
Изучай Lua с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 40
- Уроки
- 159
Часто задаваемые вопросы
Урок «Основы FFI: ffi.cdef и ffi.load» бесплатный?
Да — полный текст урока «Основы FFI: ffi.cdef и ffi.load» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Основы FFI: ffi.cdef и ffi.load»?
Объявляйте типы C и загружайте динамические библиотеки с помощью модуля ffi LuaJIT. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Основы FFI: ffi.cdef и ffi.load»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы FFI: ffi.cdef и ffi.load
- Вызов функций C через FFI
- Указатели, структуры и массивы в FFI
- Обратные вызовы: передача функций Lua в C