Keal compile vers C11 : ce que vous savez de la machine reste vrai — disposition mémoire, ABI, éditeur de liens. Ce qui change : les bornes sont vérifiées, les entiers ne débordent pas en silence, la mémoire est libérée pour vous, et le système de types sait quels pointeurs peuvent être nuls.
| Concept | C | Keal |
|---|---|---|
| Variable | int x = 1; | var x = 1 |
| Constante | const int x = 1; | val x = 1 |
| Struct | struct P { double x; }; | record P(val x: Float) |
| Pointeur nullable | char *s = NULL; | val s: String? = null |
| Tableau | int a[] = {1, 2}; | val a = [1, 2] |
| Boucle | for (int i=0;i<3;i++) | for (i in 0..3) |
| Switch | switch (n) { case 0: … break; } | when (n) { 0 -> … } |
| Pointeur de fonction | int (*f)(int) | val f: (Int) -> Int |
| malloc / free | malloc / free | counted automatically |
| En-tête | extern int f(int); | extern func f(x: Int): Int = "f" |
| C en ligne | — | native """ … """ |
keal emit-c f.keal imprime une unité de traduction autonome, runtime compris. Rien n'est caché, et keal layout imprime les décalages et le remplissage de chaque struct.
Débordement entier, division par zéro et indexation hors bornes paniquent avec un message et une ligne, sur tous les moteurs — au lieu d'être indéfinis.
Une String qui passe vers C dit borrow ou own ; les records passent par copie sous forme de structs miroirs sans en-tête. Le vérificateur refuse ce dont il ne peut énoncer la durée de vie.
Le comptage libère tout sauf un cycle. Écrivez weak sur l'arête arrière et il meurt comme le reste.