1 points par GN⁺ 2024-08-26 | 1 commentaires | Partager sur WhatsApp

Pourquoi écrire un compilateur Rust en C ?

  • Il y a plusieurs raisons à la baisse récente de mon activité

    • des événements personnels, comme un décès dans la famille
    • une augmentation de mes responsabilités au travail
    • une baisse de ma motivation pour l’open source
    • une concentration sur un nouveau projet
  • Ce projet consiste à écrire un compilateur Rust en pur C

    • écrit en pur C, sans C++, ni flex, yacc ou Makefile
    • le projet s’appelle Dozer

Pourquoi faire cela ?

  • Il faut comprendre le bootstrapping et son importance
    • pour exécuter du code Rust, il faut un compilateur
    • le compilateur principal de Rust est rustc
    • rustc est écrit en Rust et il est nécessaire pour compiler du code Rust
    • pour compiler rustc, il faut une version précédente de rustc
    • les premières versions de rustc étaient écrites en OCaml
    • le compilateur OCaml peut être compilé avec Guile, qui est écrit en C

Le principe de descente

  • Présentation du projet Bootstrappable Builds

    • il démarre à partir d’une seed binaire de 512 octets
    • il génère progressivement des compilateurs de plus en plus complexes à partir d’un compilateur simple
    • au final, il peut compiler TinyCC, GCC, Linux, etc.
  • Rust arrive très tard dans ce processus

    • utilisation de mrustc pour compiler rustc version 1.56
    • si l’on veut utiliser Rust avant l’introduction de C++, ce n’est pas possible
  • Dozer vise à devenir un compilateur Rust bootstrapable en C

    • il doit pouvoir être bootstrapé avec TinyCC

Plan

  • Travail sur Dozer au cours des deux derniers mois

    • compilation possible avec TinyCC et cproc
    • utilisation de QBE comme backend
    • le lexer et une partie du parseur sont actuellement terminés
    • l’extension des macros/modules est reportée
    • la vérification de types ne prend en charge que i32
    • la génération de code est encore insuffisante
  • Plan pour la suite

    • faire progresser Dozer étape par étape afin de pouvoir compiler des exemples de base utilisant libc, puis libcore, puis rustc
    • créer un outil similaire à cargo pour compiler des paquets Rust
    • supprimer le code généré automatiquement
    • créer un processus permettant de compiler rustc et cargo

Résumé de GN⁺

  • Cet article présente un projet visant à écrire un compilateur Rust en pur C
  • Il explique l’importance du bootstrapping et le processus de création d’un compilateur Rust par ce biais
  • Le projet Dozer vise un compilateur Rust bootstrapable en C
  • Le projet est très ambitieux, et sa réussite reste incertaine, mais la tentative elle-même a du sens

1 commentaires

 
GN⁺ 2024-08-26
Commentaires sur Hacker News
  • Pour amorcer Rust, il vaudrait mieux écrire un proto-Rust en C, puis écrire le compilateur Rust complet en proto-Rust

    • Le proto-Rust n’aurait ni borrow checker ni support des macros, ne libérerait pas la mémoire et n’aurait pas besoin de générer du bon code
    • Le proto-Rust serait du C avec une syntaxe Rust
    • Je me demande pourquoi cette voie n’a pas été choisie
  • J’écris un compilateur C en Rust comme passe-temps, que j’appelle "Small C Compiler"

    • Il utilise Cranelift comme backend, et l’architecture du compilateur est enfichable et bidouillable
    • Pas de projet open source tant qu’il ne sait pas traiter printf("Hello World!")
    • J’essaie d’implémenter le préprocesseur et l’analyseur syntaxique, et je contribue à rust-peg et HimeCC
    • Je suis curieux de connaître la solution académique au problème des typedef
  • Le même problème d’amorçage existe aussi dans le matériel

    • Les ordinateurs sont fabriqués avec des ordinateurs et des logiciels préexistants
    • C’est un sujet intéressant à méditer
  • J’ai dû suivre quatre liens pour trouver l’intérêt du bootstrapping

    • Je m’attendais à ce que le "pourquoi" du titre explique la raison
  • Dès que le C++ est introduit dans la chaîne d’amorçage, l’amorçage est pratiquement terminé

    • Si l’on veut utiliser Rust, il faut l’utiliser avant l’introduction du C++
    • Ce serait bien que le compilateur Rust puisse être amorcé depuis du C
    • Mais les anciennes versions de rustc sont compilées avec des versions antérieures de rustc
    • On peut compiler avec succès un compilateur OCaml avec Guile
    • L’auteur préfère supprimer l’étape C++ et privilégier l’étape C
    • La motivation de l’auteur n’est pas claire
  • Pour générer un nouveau binaire sur le système cible, rustc doit prendre en charge ce système

    • Si l’on ajoute cette prise en charge à rustc, il peut ensuite se compiler lui-même
  • J’imagine écrire un interpréteur ou un compilateur C++ en Scheme

    • Passer directement de Scheme au gcc actuel serait un énorme raccourci
    • Mais l’idée reçue veut qu’écrire un compilateur C++ soit presque impossible
  • En regardant toute la pile, cela pourrait être une manière de contourner le problème du "trusting trust"

  • J’aime bien l’utilisation de QBE comme backend

    • Il serait intéressant de voir une comparaison avec Rust et LLVM
    • Bonne chance
  • On pourrait envisager d’utiliser FORTH comme partie de la chaîne d’outils dans le processus d’amorçage