Lua : Interopérabilité de Lua avec le C

Par lcirpaci, 13 mars, 2025
Lua logo

Interopérabilité de Lua avec le C : LuaJIT et FFI

Lua est un langage de script léger et puissant, souvent utilisé comme langage embarqué dans des applications plus complexes. Une de ses forces réside dans sa capacité à interagir avec du code C, ce qui permet d'accéder à des bibliothèques natives et d'améliorer significativement les performances. Cet article explore comment étendre Lua avec du C, en mettant l'accent sur l'utilisation du module FFI (Foreign Function Interface) de LuaJIT.

Pourquoi interfacer Lua avec du C ?

L'interopérabilité entre Lua et C permet de :

  • Optimiser les performances : Lua est interprété, tandis que C est compilé et exécuté plus rapidement.

  • Accéder à des bibliothèques natives : Beaucoup de bibliothèques système ou graphiques sont écrites en C.

  • Gérer des ressources système : Accès bas niveau à la mémoire, aux fichiers, et au réseau.

Les approches classiques pour appeler du C depuis Lua

Il existe deux principales manières d'appeler du code C depuis Lua :

  1. Utiliser l'API C de Lua : En écrivant des modules en C qui interagissent avec l'interpréteur Lua.

  2. Utiliser le module FFI de LuaJIT : Une méthode plus simple et plus rapide qui permet d'appeler directement des fonctions C.

Nous nous concentrerons ici sur l'approche FFI, qui est plus efficace et plus facile à utiliser et surtout que l'api c de lua native est concu plus dans des cadres d'application plsu restrictif tel que des jeux vidéo qui l'exploite.

Introduction au module FFI de LuaJIT

Imaginons que nous ayons une bibliothèque mathlib.c contenant la fonction suivante :

#include <stdio.h>
int multiply(int a, int b) {
    return a * b;
}

Compilons ce code en une bibliothèque partagée :

gcc -shared -o mathlib.so -fPIC mathlib.c

En Lua, nous pouvons maintenant l'utiliser via FFI :

local ffi = require("ffi")
local mathlib = ffi.load("./mathlib.so")
ffi.cdef[[
    int multiply(int a, int b);
]]
print(mathlib.multiply(4, 5)) -- 20

Gestion de la mémoire avec FFI

FFI permet aussi d'allouer de la mémoire directement en dehors du garbage collecter :

local ptr = ffi.new("int[10]")
ptr[0] = 42
print(ptr[0]) -- 42

Le module FFI de LuaJIT permet une interopérabilité fluide avec du code C sans avoir à écrire de wrapper manuel complexe. Il est idéal pour accéder à des bibliothèques système ou optimiser des parties critiques de son code Lua.

Références

  • Mike Pall, « The LuaJIT Project », luajit.org, https://luajit.org/ext_ffi_tutorial.html
  • Sylvain Fabre et al., Le guide de lua et ses applications : Manuel d'apprentissage, D-Booker, 04/2016, pages 137-148
  • Sylvain Fabre et al., Le guide de lua et ses applications : Manuel de référence, D-Booker, 04/2016, pages 303-315.

Étiquettes

Commentaires