Je viens de C

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.

ConceptCKeal
Variableint x = 1;var x = 1
Constanteconst int x = 1;val x = 1
Structstruct P { double x; };record P(val x: Float)
Pointeur nullablechar *s = NULL;val s: String? = null
Tableauint a[] = {1, 2};val a = [1, 2]
Bouclefor (int i=0;i<3;i++)for (i in 0..3)
Switchswitch (n) { case 0: … break; }when (n) { 0 -> … }
Pointeur de fonctionint (*f)(int)val f: (Int) -> Int
malloc / freemalloc / freecounted automatically
En-têteextern int f(int);extern func f(x: Int): Int = "f"
C en lignenative """ … """

Ce qui vous surprendra

Vous pouvez lire le C qu'il produit

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.

Vérifié là où C se tait

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.

La propriété à la frontière est écrite

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.

Les cycles sont la seule fuite restante

Le comptage libère tout sauf un cycle. Écrivez weak sur l'arête arrière et il meurt comme le reste.