0Pricing
Lua Academy · Lezione

Chiamata delle funzioni C tramite FFI

Invoci funzioni di libc e di librerie condivise personalizzate da Lua senza overhead.

Chiamata delle funzioni C tramite FFI è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.

Chiamare direttamente le funzioni C

Una volta dichiarate con ffi.cdef, le funzioni C vengono chiamate esattamente come le funzioni Lua tramite l'oggetto libreria. Gli argomenti e i valori restituiti vengono convertiti automaticamente.

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

Conversione dei tipi

I numeri Lua diventano per impostazione predefinita double C. L'FFI converte automaticamente il valore nel tipo del parametro C dichiarato. I booleani diventano 0/1. Le stringhe diventano const char*.

Chiamare printf

printf è una funzione C variadica. La chiami tramite ffi.C.printf con stringhe di formato e argomenti.

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

Gestione dei valori restituiti

I valori restituiti da C vengono convertiti automaticamente in tipi Lua. Gli interi diventano numeri Lua, mentre char* diventa lightuserdata (utilizzi ffi.string per convertire il valore).

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) converte un puntatore char* in una stringa Lua. Senza len, legge fino a un byte nullo.

Gestione degli errori

Le funzioni C restituiscono codici di errore o impostano errno. Controlli esplicitamente i valori restituiti. Acceda a errno tramite 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

Argomenti struct

Passi le struct C per valore o tramite puntatore. Le crei con 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)

Argomenti puntatore

Passi puntatori di output alle funzioni che restituiscono più valori tramite parametri puntatore.

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

Prestazioni delle chiamate FFI

Le chiamate FFI alle funzioni C hanno un overhead quasi nullo e sono molto più veloci delle chiamate da Lua a C tramite la tradizionale C API. Spesso il JIT riesce a incorporare completamente la chiamata.

Funzioni variadiche

Le funzioni C variadiche (...) devono essere chiamate con i tipi corretti. Se necessario, passi cast di tipo espliciti per evitare ambiguità.

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

Pratiche di sicurezza

Controlli sempre che i puntatori restituiti non siano NULL. Non passi mai un puntatore già liberato o fuori ambito. Utilizzi ffi.gc per associare finalizzatori alle allocazioni C.

Domanda sulle chiamate FFI

In che modo l'FFI converte una stringa Lua in un const char* C?

Riepilogo: chiamare C tramite FFI

Chiami le funzioni C tramite l'oggetto libreria, proprio come le funzioni Lua. L'FFI gestisce la conversione dei tipi. Utilizzi ffi.string per i valori char* restituiti, ffi.errno() per gli errori e ffi.new per gli argomenti struct/array.

Domande Frequenti

La lezione «Chiamata delle funzioni C tramite FFI» è gratuita?

Sì — il testo completo di «Chiamata delle funzioni C tramite FFI» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.

Cosa imparerò in «Chiamata delle funzioni C tramite FFI»?

Invoci funzioni di libc e di librerie condivise personalizzate da Lua senza overhead. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Lua Academy?

Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Chiamata delle funzioni C tramite FFI»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Lua Academy?

Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Nozioni di base sulla FFI: ffi.cdef e ffi.load
  2. Chiamata delle funzioni C tramite FFI
  3. Puntatori, struct e array nella FFI
  4. Callback: passaggio di funzioni Lua a C
← Torna a Lua Academy