Retour au portfolio

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

Le pipeline de compilation de Nacre

  1. Sources Nacre

    Le frontend collecte les fichiers, résout les modules et vérifie les types, l’ownership et les emprunts.

  2. 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.

  3. Exécutable Linux

    Le compilateur natif s’appuie sur le toolchain C du système et sur le runtime fourni par Nacre.

Option --direct. Les fonctions utilisateur et main sont émises en LLVM ; le runtime et le support de bibliothèque sont compilés séparément en bitcode puis liés avec llvm-link avant l’édition de liens Clang.

README.md · docs/ARCHITECTURE.md
  1. 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.

  2. 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.

  3. 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.

  4. 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.