À propos du projet
rucc est un compilateur C optimisant en phase initiale écrit en Rust. Selon le README, l'échelle des cibles du projet est SQLite, puis un niveau intermédiaire de projets C connus, puis PostgreSQL, et enfin le noyau Linux, sans qu'aucun patch de source ne soit autorisé sur cette échelle. Le README indique clairement que rien ne compile encore le C. M0 et M1 sont terminés, tagués v0.1.0 et v0.2.0. M0 couvrait l'espace de travail, la règle de couche vérifiée, l'analyse des arguments et le plan de phase du pilote, l'ordonnanceur de tâches, et la CI sur Linux, macOS et Windows. M1 est le préprocesseur, décrit comme terminé : phases de traduction, expansion de macros hide set, directives incluant _Pragma et #embed, résolution d'inclusion avec #include_next et #pragma once, la famille __has_*, et les macros prédéfinies générées à partir de la description de la cible. rucc -E a.c est décrit comme un véritable préprocesseur dont la sortie est comparée à un compilateur de référence sur les ensembles d'en-têtes glibc et musl. rucc a.c imprime actuellement le plan de phase et signale que les phases après le préprocesseur ne sont pas implémentées.
La section conception décrit plusieurs choix prévus ou en cours. Les règles de réécriture et les modèles de sélection d'instructions sont écrits dans un DSL unique ; le même texte de règle est compilé dans le matcher et remis à un solveur SMT dans la CI, et les règles que le solveur ne peut pas décharger n'entrent pas dans l'ensemble de règles. L'IR est destiné à n'avoir ni poison ni undef. Des e-graphs acycliques sont prévus pour la réécriture, le pliage de constantes et le mouvement de code global, avec un réécrivain e-graph et un pipeline de passes conventionnel construits et mesurés pour choisir le gagnant. Une règle de couche est vérifiée par cargo xtask layers, assignant des rangs aux crates afin qu'une crate ne puisse dépendre que de rangs strictement inférieurs. Le chemin de compilation vise à n'avoir aucun assembleur ou éditeur de liens externe : les instructions sont encodées en octets, ELF, Mach-O et COFF sont écrits dans le projet, et DWARF est émis dans le projet. Le README précise que l'édition de liens fait toujours appel à un éditeur de liens réel avant la version 1.0, et que la question de savoir si cela restera vrai demeure ouverte.
Le README présente les objectifs comme des affirmations mesurables sur la correction, le débit de compilation, la qualité du code et la portabilité, avec la méthodologie et les règles de rapport placées dans spec/16-performance.md avant que les résultats n'existent. La disposition du dépôt décrite dans le README comprend des crates pour le compilateur, des build-tools pour le compilateur DSL de règles et le vérificateur SMT, des crates de runtime compilées pour la cible, vingt documents de spécification plus dix-sept documents de compilation croisée, des docs générés, l'automatisation de build xtask, et des tests. Les options d'installation incluent des binaires préconstruits pour Linux, macOS et Windows avec des fichiers SHA-256 et des attestations de provenance de build, ainsi que cargo install rucc. La construction est documentée comme git clone, cargo build --release, sans configure, CMake, Python dans le build, ou génération de code en dehors de build.rs et xtask. Les tâches incluent cargo xtask layers, cargo xtask style, et cargo xtask ci. Le README liste les éléments hors de portée comme le C++, les extensions de dialecte MSVC, un JIT, MSan, et un compilateur vérifié de style CompCert. La licence est Apache-2.0.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.