LuaJIT include o bibliotecă revoluționară numită FFI (Foreign Function Interface). Aceasta permite utilizatorului să declare și să apeleze funcții native scrise în C, precum și să aloce structuri de date C direct din Lua, fără a fi nevoie de scrierea de cod de legătură (wrapper boilerplate) sau de recompilarea interpretului.
Declararea și apelarea funcțiilor din biblioteca standard C (libc)
local ffi = require("ffi")
-- 1. Declarăm antetul funcțiilor C folosind sintaxă pură C:
ffi.cdef[[
int getpid(void);
unsigned int sleep(unsigned int seconds);
double sin(double x);
]]
-- 2. Apelarea directă a funcțiilor prin ffi.C:
local pid = ffi.C.getpid()
print("Process ID-ul procesului curent:", pid)
local valSinus = ffi.C.sin(3.1415926535 / 2)
print("Sinus de Pi/2 calculat prin libc:", valSinus) -- ~ 1.0
Definirea structurilor C și alocarea de memorie nativă de mare viteză
local ffi = require("ffi")
-- Declarăm o structură C de particulă:
ffi.cdef[[
typedef struct {
float x, y, z;
int id;
} Particula;
]]
-- Alocăm o structură nativă C cu ffi.new (nu trece prin Garbage Collector-ul Lua):
local p1 = ffi.new("Particula", 10.5, 20.0, -5.2, 1001)
print("Particula ID:", p1.id)
print("Coordonata X:", p1.x)
-- Alocarea unui array masiv nativ C de 1.000.000 de întregi:
local tablou = ffi.new("int[1000000]")
tablou[0] = 42 -- În FFI C, indexarea începe de la 0!
tablou[999999] = 999
print("Elementul 0:", tablou[0])
print("Dimensiunea array-ului în octeți:", ffi.sizeof(tablou)) -- 4.000.000 octeți (4 MB)
| Funcție FFI | Semnătură | Descriere |
|---|---|---|
ffi.cdef(declaratii_c) |
string |
Înregistrează tipuri, structuri și prototipuri de funcții scrise în limbajul C. |
ffi.load(cale_lib) |
string |
Încarcă o bibliotecă dinamică partajată (.so sau .dylib / .dll). |
ffi.new(tip, [init]) |
ctypedef, ... |
Alocă o instanță a unui tip nativ C în memorie. |
ffi.cast(tip, val) |
ctypedef, val |
Efectuează o conversie de tip de pointer C (type casting). |