- CCC (Claude’s C Compiler), entièrement écrit par Claude Opus 4.6 d’Anthropic, a été publié en affirmant pouvoir compiler le noyau Linux
- Ce compilateur autonome écrit en Rust implémente lui-même tous les composants, du frontend au linker, mais ses performances et la qualité de ses optimisations restent très inférieures à celles de GCC
- Lors de benchmarks sur SQLite et le noyau Linux, CCC a compilé tous les fichiers C sans erreur, mais la compilation a échoué à l’étape du linker avec plus de 40 000 erreurs de référence
- Les performances d’exécution de SQLite sont jusqu’à 158 000 fois plus lentes, la taille du binaire est plus de 3 fois supérieure, et les options d’optimisation (
-O2, etc.) sont sans effet
- Le fait qu’une IA ait généré un compilateur C complet est significatif sur le plan technique, mais le niveau d’efficacité et de compatibilité reste insuffisant pour un usage réel
Vue d’ensemble et architecture de CCC
- CCC est un compilateur C entièrement écrit par une IA à l’aide de Claude par Anthropic, avec prise en charge de x86-64, i686, AArch64 et RISC-V 64
- Écrit en Rust, il inclut un IR basé sur SSA, un optimiseur, un générateur de code, un assembleur, un linker et même la génération d’informations de débogage DWARF
- L’article distingue les rôles du compilateur, de l’assembleur et du linker, en précisant que le linker est le plus complexe et le plus susceptible de provoquer des erreurs
- Comme le noyau Linux utilise des extensions GCC et des scripts de linkage complexes, il n’était pas adapté comme première cible de test ; SQLite a donc été choisi comme benchmark principal
Environnement et méthode de test
- Comparaison entre GCC 14.2.0 et CCC dans les mêmes conditions sur deux VM basées sur Debian (6 vCPU, 16 Go de RAM)
- Éléments comparés : temps de compilation, taille du binaire, vitesse d’exécution, consommation mémoire, stabilité
- CCC délègue uniquement le code de démarrage 16 bits à GCC via la fonctionnalité gcc_m16, et traite tout le reste lui-même
- Le benchmark SQLite, centré sur le CPU, exécute 42 opérations SQL en 10 étapes
Résumé des principaux résultats
- Noyau Linux 6.9 : CCC a compilé les 2 844 fichiers C, mais a échoué à l’étape du linker avec 40 784 erreurs d’
undefined reference
- Cause des erreurs : mauvaises relocations et génération de symboles dans les sections
__jump_table et __ksymtab
- Compilation de SQLite : CCC est 1,3 fois plus lent que GCC, avec un binaire 2,7 à 3 fois plus gros et une consommation mémoire 5,9 fois supérieure
- Performances d’exécution de SQLite : 737 fois plus lent que GCC
-O0, et 1 242 fois plus lent que GCC -O2
- Les requêtes simples sont 1 à 7 fois plus lentes, tandis que les requêtes à boucles imbriquées peuvent être jusqu’à 158 000 fois plus lentes
- Les 5 tests de crash ont tous été réussis, ce qui confirme la correction fonctionnelle
Causes de la dégradation des performances
- Spilling excessif des registres : la plupart des variables locales sont stockées sur la pile, provoquant un excès d’accès mémoire
- Dans la fonction
sqlite3VdbeExec, plus de 100 variables sont gérées via la pile, ce qui triple la longueur du code
- Options d’optimisation sans effet : les résultats de
-O0 et -O2 sont strictement identiques, les 15 passes SSA étant exécutées de la même manière à tous les niveaux
- Corruption du frame pointer, rendant le débogage avec GDB impossible
- Gonflement de la taille du code : le binaire SQLite atteint 4,27 Mo, soit 2,78 fois la taille obtenue avec GCC, ce qui augmente les défauts de cache d’instructions
- Absence de table des symboles : impossible de profiler faute de symboles pour les fonctions internes
Forces et limites de CCC
- Forces
- Compile sans erreur tous les fichiers C du noyau Linux
- Garantit la justesse et la stabilité des résultats sur SQLite, sans segfault
- Prend en charge une interface en ligne de commande compatible avec GCC
- Limites
- Vitesse d’exécution extrêmement dégradée (jusqu’à 158 000 fois plus lente)
- Échec de la compilation du noyau en raison d’une incompatibilité du linker
- Taille du binaire et consommation mémoire excessives
- Absence d’optimisation et d’informations de débogage, options
-O sans effet
- Vitesse de compilation également inférieure à GCC, d’environ 25 %
Le problème du « Hello World »
- Peu après la publication, un problème intitulé « Hello world does not compile » est apparu
- Échec à l’étape de prétraitement faute de trouver
stddef.h et stdarg.h
- Le sujet a attiré l’attention sur GitHub avec plus de 288 réactions et environ 200 commentaires
- Certains utilisateurs l’ont jugé « semblable à un projet de compilateur de niveau licence »
Conclusion
- CCC constitue un cas concret montrant qu’une IA peut générer un compilateur C complet
- Il traite sans erreur tous les fichiers C du noyau Linux et exécute SQLite avec une correction fonctionnelle
- Cependant, il reste inadapté à un usage réel
- Les performances d’exécution sont extrêmement faibles, et les fonctions de linkage, d’optimisation et de débogage restent inachevées
- En tant que réussite de recherche, le projet a de l’intérêt, mais pour un compilateur de production, les outils existants comme GCC et Clang restent indispensables
Aucun commentaire pour le moment.