FFI — Interopérabilité C¶
Galois peut appeler des fonctions C natives grâce au FFI (Foreign Function Interface).
Déclaration externe¶
Le mot-clé externe déclare une fonction C :
externe fonction printf(format: texte): entier
externe fonction malloc(taille: entier): pointeur_vide
externe fonction free(ptr: pointeur_vide): rien
Convention d'appel¶
Par défaut, la convention d'appel C est utilisée. On peut la préciser :
Types FFI¶
| Type Galois | Type C | Description |
|---|---|---|
c_int |
int |
Entier C standard |
c_long |
long |
Entier long C |
c_double |
double |
Flottant double précision C |
c_char |
char |
Caractère C |
pointeur<T> |
T* |
Pointeur vers un type T |
pointeur_vide |
void* |
Pointeur générique |
Exemples¶
Appel de printf¶
externe "c" fonction printf(format: texte): entier
fonction principal()
printf("Bonjour depuis C !\n")
fin
Allocation mémoire¶
externe fonction malloc(taille: c_long): pointeur_vide
externe fonction free(ptr: pointeur_vide): rien
fonction exemple()
soit tampon = malloc(1024 comme c_long)
// ... utilisation du tampon ...
free(tampon)
fin
Pointeurs typés¶
externe fonction fopen(chemin: texte, mode: texte): pointeur<c_char>
externe fonction fclose(fichier: pointeur<c_char>): c_int
fonction lire_fichier(chemin: texte)
soit f = fopen(chemin, "r")
si f == nul alors
afficher("Impossible d'ouvrir le fichier")
retourne
fin
fclose(f)
fin
Sécurité¶
Attention
Les appels FFI contournent la sécurité du typage de Galois. Une erreur dans un appel FFI peut provoquer un comportement indéfini, un segfault ou une corruption mémoire.
Recommandations :
- Vérifiez toujours les pointeurs contre
nulaprès un appel FFI - Encapsulez les appels FFI dans des fonctions Galois sécurisées
- Libérez toujours la mémoire allouée par C
- Utilisez les types FFI (
c_int,c_long, etc.) pour les paramètres
Fonctions de la bibliothèque C disponibles¶
Le runtime Galois déclare automatiquement les fonctions C suivantes :
| Fonction | Signature |
|---|---|
printf |
(texte, ...) -> entier |
puts |
(texte) -> entier |
malloc |
(entier) -> pointeur_vide |
free |
(pointeur_vide) -> rien |
strlen |
(texte) -> entier |
atoi |
(texte) -> entier |
atof |
(texte) -> décimal |
sqrt |
(décimal) -> décimal |
sin |
(décimal) -> décimal |
cos |
(décimal) -> décimal |
tan |
(décimal) -> décimal |
log |
(décimal) -> décimal |
exp |
(décimal) -> décimal |
pow |
(décimal, décimal) -> décimal |
fabs |
(décimal) -> décimal |
ceil |
(décimal) -> décimal |
floor |
(décimal) -> décimal |