La silhouette de Kotlin sur une syntaxe famille C, compilé en natif, avec une destruction déterministe et sans ramasse-miettes — et sans vérificateur d'emprunts à convaincre. Trois moteurs qui doivent s'accorder sur chaque octet imprimé.
class Point(val x: Float, val y: Float) {
func length(): Float { sqrt(this.x * this.x + this.y * this.y) }
func toString(): String { "(${this.x}, ${this.y})" }
}
func firstLong(points: List<Point>, min: Float): Point? {
for (p in points) {
if (p.length() > min) { return p }
}
return null
}
val found = firstLong([Point(1.0, 1.0), Point(3.0, 4.0)], 2.0)
println(when {
found == null -> "nothing long enough"
else -> "${found} has length ${found.length()}"
})Lexeur, parseur, vérificateur et backend C — tenus octet pour octet face à leurs oracles Rust, et reproduisant leur propre source.
Inférence partout, rétrécissement qui tient à travers and, les retours anticipés, et même implies.
C, C++, Rust, Go, Java et Kotlin répondent tous depuis un unique programme Keal.
Un objet meurt quand meurt sa dernière référence, à une frontière d'instruction qu'on peut désigner, et deinit s'y exécute. Pas de pause, pas de génération, pas d'annotation de durée de vie.
keal lsp donne à VS Code, Neovim, Helix et Zed la même chose : les erreurs pendant qu'on tape, les types au survol, aller à la définition, renommer. Il réutilise le compilateur plutôt que de modéliser le langage deux fois.
Les quatre natifs rencontrent Keal sur l'ABI C que ses binaires parlent déjà — pas de runtime, pas de couche de conversion. Java et Kotlin passent par un module passerelle, écrit en Keal.
L'interpréteur arborescent est la spécification. La VM à bytecode est le défaut. keal build compile via C11 vers un vrai exécutable. La suite exécute chaque programme sur les trois et exige une sortie identique à l'octet.
fib(35) — le même programme, sur les trois moteurs.
Trois programmes qui se servent du langage pour ce à quoi il sert, et rapportent ce qu'ils trouvent. Chacun a trouvé des défauts que la suite ne pouvait pas voir : une table qui bouclait après avoir été vidée deux fois, un record qui s'imprimait avec un test de pointeur sur une valeur qui n'en est pas une, un type que le backend natif ne savait pas compiler du tout.
Un cadriciel web — routage, sessions, SQLite, pages vivantes.
Un cadriciel graphique — rastériseur, TrueType, mise en page, widgets.
Un langage de schémas et de requêtes PostgreSQL, compilé vers SQL.
L'IDE — écrit en Keal, dessiné par keal-view.
git clone https://github.com/geneacta/keal cd keal cargo build --release ./bootstrap.sh
Puis faites le tour — 30 minutes, chaque extrait s'exécute →