LuaJIT FFI: Apelarea Directă a Bibliotecilor C Native și Structurilor de Mare Performanță în Lua

Ghid complet pentru modulul FFI (Foreign Function Interface) din LuaJIT: declararea funcțiilor C cu ffi.cdef, alocarea memoriei native cu ffi.new și apelarea directă a bibliotecilor libc la viteze native.

Sintaxă
local ffi = require("ffi"); ffi.cdef[[ int getpid(void); ]]; ffi.C.getpid()

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).