Compilateur natif expérimental · Rust · Linux · alpha
Nacre
Comment compiler un langage à syntaxe Java sans JVM ?
Nacre est un compilateur alpha de langage natif pour Linux, implémenté en Rust avec une syntaxe proche de Java. Le chemin par défaut génère du C11 puis s’appuie sur GCC ou Clang ; un backend LLVM direct est également disponible en option.
Le projet en bref
- Nature
- Compilateur natif expérimental · alpha
- Implémentation
- Rust · syntaxe source proche de Java
- Backend par défaut
- C11 → GCC ou Clang
- Autre backend
- LLVM direct en option
- Cible
- Linux · pré-1.0
Deux voies vers un exécutable natif
La voie habituelle traduit le programme en C11 avant l’édition de liens native. L’option --direct émet le LLVM des fonctions utilisateur et de main ; le runtime C et les éléments de bibliothèque nécessaires restent compilés séparément puis liés au module LLVM.
Des sources à l’exécutable
Sources Nacre
Le frontend collecte les fichiers, résout les modules et vérifie les types, l’ownership et les emprunts.
Génération C11
Le backend par défaut génère du C11 et le compile avec GCC ou Clang pour produire un exécutable natif.
Exécutable Linux
Le compilateur natif s’appuie sur le toolchain C du système et sur le runtime fourni par Nacre.
01 · Une syntaxe familière, une compilation native
Nacre est un compilateur expérimental écrit en Rust, pour un langage dont la syntaxe rappelle Java. Il ne traduit pas les programmes vers une JVM : la cible décrite est un exécutable natif Linux.
Par défaut, le compilateur génère du C11 puis laisse GCC ou Clang construire l’exécutable. L’option --direct offre une autre voie : les fonctions utilisateur et main deviennent du LLVM, tandis que le runtime C est compilé à part en bitcode puis lié au module utilisateur.
02 · Possession affine et emprunts explicites
Les valeurs propriétaires ordinaires sont affines : déplacer une valeur transfère sa responsabilité de destruction. Le langage distingue les emprunts partagés des emprunts exclusifs, et le compilateur vérifie leurs conflits ainsi que les déplacements.
Ce modèle n’utilise ni ramasse-miettes, ni JVM, ni comptage implicite des références. Il décrit les règles du langage, pas une garantie de sûreté générale : le runtime C fait partie du socle natif et les programmes ne sont pas sandboxés.
03 · Une bibliothèque standard et des programmes concrets
La bibliothèque standard est injectée dans les programmes. Elle comprend des collections affines, Text en UTF-8, des tampons binaires, des options et résultats, ainsi que des API pour les fichiers, processus, threads, synchronisation explicite, expressions régulières, temps et sockets TCP/UDP.
Le dépôt accompagne le langage d’exemples plus complets : carnet de contacts, bureau de prêt, Sudoku, jeu de la vie et serveur HTTP. Ils illustrent notamment les collections, les emprunts et les API natives ; leur présence ne transforme pas l’alpha en version stabilisée.
04 · Un alpha Linux avec des limites assumées
Linux est la seule cible native annoncée. Le projet est pré-1.0 et ne garantit pas la compatibilité du langage ou de sa bibliothèque standard entre versions.
Les paramètres de durée de vie et les itérateurs empruntés qui s’échappent ne sont pas pris en charge ; le FFI général, l’héritage de classes, l’interface graphique et l’exécution JVM ne font pas partie du langage actuel. Le dépôt précise aussi que Nacre n’est pas un bac à sable ni une certification de sécurité.
Code, documentation et état du développement
- Dépôt Nacre
README.md : présentation, backend par défaut, mode LLVM optionnel, bibliothèque standard et exemples.
- Architecture et ownership
docs/ARCHITECTURE.md et docs/BORROWING.md : pipeline du compilateur, représentation native et règles d’emprunt.
- Feuille de route
docs/ROADMAP.md : capacités actuelles, portée expérimentale et limites connues.
