- CCC (Claude’s C Compiler), vollständig von Anthropic's Claude Opus 4.6 geschrieben, wurde mit der Behauptung veröffentlicht, den Linux-Kernel kompilieren zu können
- Der eigenständige Compiler in Rust implementiert alle Komponenten vom Frontend bis zum Linker selbst, bleibt aber bei Leistung und Optimierungsqualität deutlich hinter GCC zurück
- In Benchmarks mit SQLite und dem Linux-Kernel kompilierte CCC zwar alle C-Dateien fehlerfrei, doch der Build scheiterte in der Linker-Phase an über 40.000 Referenzfehlern
- Die Ausführung von SQLite ist bis zu 158.000-mal langsamer, die Binärdatei ist mehr als dreimal so groß, und Optimierungsoptionen (-O2 usw.) haben keine Wirkung
- Dass eine KI einen vollständigen C-Compiler erzeugt hat, ist technisch bedeutsam, doch Effizienz und Kompatibilität reichen für den praktischen Einsatz noch nicht aus
Überblick und Struktur von CCC
- CCC ist ein von Anthropic mit Claude erstellter vollständig KI-geschriebener C-Compiler und unterstützt x86-64, i686, AArch64, RISC-V 64
- In Rust geschrieben, mit SSA-basierter IR, Optimierer, Codegenerator, Assembler, Linker und Erzeugung von DWARF-Debuginformationen
- Es wird die Rollen von Compiler, Assembler und Linker getrennt erklärt, wobei der Linker als am komplexesten und fehleranfälligsten beschrieben wird
- Da der Linux-Kernel GCC-Erweiterungen und komplexe Linker-Skripte nutzt, ist er als früher Testfall ungeeignet; stattdessen wurde SQLite als zentraler Benchmark gewählt
Testumgebung und Methode
- Vergleich von GCC 14.2.0 und CCC unter identischen Bedingungen auf zwei Debian-basierten VMs (6 vCPU, 16 GB RAM)
- Verglichene Punkte: Kompilierzeit, Binärgröße, Ausführungsgeschwindigkeit, Speichernutzung, Stabilität
- CCC delegiert über die gcc_m16-Funktion nur 16-Bit-Boot-Code an GCC und verarbeitet den Rest selbst
- Der SQLite-Benchmark ist CPU-zentriert aufgebaut und führt 42 SQL-Operationen in 10 Schritten aus
Zusammenfassung der wichtigsten Ergebnisse
- Linux-Kernel 6.9: CCC kompilierte alle 2.844 C-Dateien, scheiterte aber in der Linker-Phase an 40.784
undefined reference-Fehlern
- Fehlerursache: fehlerhafte Relocations und Symbolerzeugung in den Abschnitten
__jump_table und __ksymtab
- SQLite-Kompilierung: CCC ist 1,3-mal langsamer als GCC, bei 2,7- bis 3-mal größerer Binärdatei und 5,9-mal höherem Speicherverbrauch
- SQLite-Ausführungsleistung: 737-mal langsamer als GCC -O0 und 1.242-mal langsamer als GCC -O2
- Einfache Abfragen sind 1- bis 7-mal langsamer, verschachtelte Schleifenabfragen bis zu 158.000-mal langsamer
- Alle 5 Crash-Tests bestanden, die funktionale Korrektheit ist also gegeben
Ursachen des Leistungsabfalls
- Übermäßiges Register-Spilling: Die meisten lokalen Variablen werden auf dem Stack gespeichert, was zu übermäßig vielen Speicherzugriffen führt
- In der Funktion
sqlite3VdbeExec werden über 100 Variablen über den Stack verarbeitet, wodurch sich die Codelänge verdreifacht
- Optimierungsoptionen wirkungslos: Die Ergebnisse von
-O0 und -O2 sind vollkommen identisch; alle 15 SSA-Passes laufen auf jeder Stufe gleich ab
- Beschädigter Frame Pointer macht Debugging mit GDB unmöglich
- Aufgeblähte Codegröße: Die SQLite-Binärdatei ist mit 4,27 MB 2,78-mal größer als bei GCC, was mehr Instruction-Cache-Misses verursacht
- Keine Erzeugung einer Symboltabelle: Ohne interne Funktionssymbole ist Profiling nicht möglich
Stärken und Grenzen von CCC
- Stärken
- Kompiliert alle C-Dateien des Linux-Kernels fehlerfrei
- Korrektheit und Stabilität der SQLite-Ergebnisse sind gegeben, keine Segmentation Faults
- Unterstützung einer GCC-kompatiblen Kommandozeilenschnittstelle
- Grenzen
- Extremer Einbruch der Ausführungsgeschwindigkeit (bis zu 158.000-mal)
- Linker-Inkompatibilität führt zum Fehlschlag des Kernel-Builds
- Zu große Binärdateien und zu hoher Speicherverbrauch
- Fehlende Optimierung und Debuginformationen,
-O-Optionen ohne Wirkung
- Auch die Kompiliergeschwindigkeit ist 25 % langsamer als bei GCC
Das „Hello World“-Problem
- Kurz nach der Veröffentlichung trat das Problem „Hello world does not compile“ auf
- In der Präprozessor-Phase scheiterte es daran,
stddef.h und stdarg.h nicht zu finden
- Das Thema sorgte auf GitHub mit über 288 Reaktionen und rund 200 Kommentaren für Aufmerksamkeit
- Einige Nutzer bewerteten es als „eine Compiler-Aufgabe auf Bachelor-Niveau“
Fazit
- CCC ist ein Beleg dafür, dass eine KI einen vollständigen C-Compiler erzeugen kann
- Alle C-Dateien des Linux-Kernels werden fehlerfrei verarbeitet, und SQLite läuft funktional korrekt
- Für den praktischen Einsatz ist CCC jedoch ungeeignet
- Die Ausführungsleistung ist extrem schwach, und Linker-, Optimierungs- und Debugging-Funktionen sind unvollständig
- Als Forschungsleistung ist es bedeutend, doch für produktive Compiler bleiben bestehende Werkzeuge wie GCC und Clang weiterhin unverzichtbar
Noch keine Kommentare.