Lua Academy · Урок

Основы FFI: ffi.cdef и ffi.load

Объявляйте типы C и загружайте динамические библиотеки с помощью модуля ffi LuaJIT.

Урок 1 из 413 шагов

«Основы 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 — локальная установка не требуется.

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

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