Vergleich des von Claude erzeugten C-Compilers mit GCC
(harshanu.space)- 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_tableund__ksymtab
- Fehlerursache: fehlerhafte Relocations und Symbolerzeugung in den Abschnitten
- 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
sqlite3VdbeExecwerden über 100 Variablen über den Stack verarbeitet, wodurch sich die Codelänge verdreifacht
- In der Funktion
- Optimierungsoptionen wirkungslos: Die Ergebnisse von
-O0und-O2sind 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.hundstdarg.hnicht 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“
- In der Präprozessor-Phase scheiterte es daran,
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
5 Kommentare
Aha, hierher stammt also das Meme „Hello world does not compile“ lol
Am Anfang erinnert die Stimmung ein wenig an Go.
Wenn man es immer weiter in einer Schleife verbessern lässt, kommt dann nicht irgendwann ein noch besserer Compiler heraus?
Es scheint, dass man der Sache zugutehalten muss, dass sie immerhin das Niveau einer Studienaufgabe im Grundstudium erreicht hat..
Hacker-News-Kommentare
Diese Debatte zeigt sehr gut die beiden gegensätzlichen Sichtweisen auf LLM-Coding-Agenten
Die Befürworter sagen: „Erstaunlich, dass in nur wenigen Stunden ein funktionierender Compiler entstanden ist“, während die Gegenseite meint: „Wenn er nicht wirklich funktioniert, hat das keine Bedeutung.“
Je komplexer die Codebasis, desto schwächer werden die Agenten, und auch gegenüber der ständig wiederholten Behauptung „Die nächste Generation wird das schon beheben“ gibt es viel Skepsis.
Anthropic sagte, man habe den Linux-Kernel kompiliert, tatsächlich scheiterte das aber, und damit wird die Kluft zwischen überzogenen AI-Erwartungen und der Realität sichtbar.
Tests zu bestehen und oberflächlich korrekt aussehende Ausgaben zu liefern ist etwas völlig anderes, als Code mit wartbarer Qualität zu haben.
Zuerst hieß es „kann nur kleine Funktionen schreiben“, dann „kann Linux nicht kompilieren“, dann „reicht nicht an GCC heran“ – die Maßstäbe verschieben sich ständig.
Betrachtet man aber das Entwicklungstempo, scheint es plausibel, dass man mit ein paar Compiler-Ingenieuren schnell aufholen könnte.
Deshalb bleibt fraglich, ob ein LLM wirklich völlig neue Probleme lösen kann.
Anthropic schrieb im Blog, dass der Linux-Kernel auch auf x86 bootet, tatsächlich scheint aber nur RISC-V erfolgreich gewesen zu sein
Im offiziellen Post hieß es, x86/ARM/RISC-V würden alle funktionieren,
in der Repo-Dokumentation gibt es jedoch nur Tests für RISC-V.
Spannend ist, wie stark die Leistungseinbußen bei nicht optimiertem C ausfallen
Beim SQLite3-Build war CCC 12-mal langsamer, die optimierte Version sogar 20-mal.
Das zeigt, wie viel Optimierungsleistung in GCC steckt.
Ein Compiler mit starkem Register-Shuffling verliert diesen Bezug jedoch und fühlt sich dann eher wie Python an.
Dass CCC sogar langsamer als
-O0ist, war überraschend.Dass CCC alle C-Dateien des Kernels ohne Fehler kompiliert hat, heißt nicht, dass dabei korrekte Ergebnisse entstanden sind
Allein das Bestehen von SQLite-Tests reicht nicht aus.
/dev/nullschreibt, gibt es keine Fehler.constund lässt auch Typ-Neudefinitionen oder fehlerhafte Casts einfach durch.Mit anderen Worten: Um das Ziel „Tests bestehen“ zu erreichen, wurde offenbar mit dem Trick gearbeitet, auch ungültigen Code zu kompilieren.
In manchen Beiträgen hieß es, „der Compiler sei der einfachste Teil“, tatsächlich ist aber der Linker der komplexeste Teil
Tausende x86-64-Befehlsencodings und die detaillierten Layouts von ELF sind für AI schwer zu handhaben.
Außerdem ergibt die Rechnung „eine Iteration 4-mal langsamer → eine Milliarde Iterationen 158.000-mal langsamer“ keinen Sinn.
Viele Befehle hätten zwar gefehlt, aber es sei auf einem Niveau gewesen, bei dem nur noch Datentabellen aufgefüllt werden mussten.
Erstaunlich ist, wie schnell sich menschliche Erwartungen verschieben
Noch vor fünf Jahren wäre die Aussage „AI baut aus einem englischen Prompt einen C-Compiler“ ein absurder Witz gewesen.
Den übertriebenen Zynismus auf HN kann ich nicht nachvollziehen
Einen C-Compiler für drei Architekturen zu bauen ist auch für Menschen schwierig,
und selbst ein Niveau, das SQLite besteht, ist als Wochenendprojekt-Leistung bemerkenswert.
Die meisten Unternehmen bauen in der Praxis keine Hochleistungscompiler, sondern Code-Klebstoff für Business-Logik.
Das Problem liegt weniger in der Technik selbst als in der Haltung der Menschen, die sie benutzen.
Die 158.000-fach langsamere Leistung bei SQLite ist der Kernpunkt
Parsing ist das leichte Problem, wirklich schwierig sind Registerallokation und Optimierungsphase.
Ein Vergleich mit GCC ist zwar wenig sinnvoll, aber dass ein LLM überhaupt so einen Compiler gebaut hat, ist bemerkenswert.
Das nächste Ziel ist, die Lücke zu GCC von 158.000-fach auf etwa 100-fach zu verringern.
Wenn jede Iteration 12-mal langsamer ist, müsste insgesamt ebenfalls nur etwa der Faktor 12 herauskommen; 158.000-fach wirkt eher wie ein Fehler oder Missverständnis.
Ob der SQLite-Test überhaupt korrekt ausgeführt wird, ist ebenfalls unzureichend verifiziert.
Trotzdem bleibt fraglich, warum die Leistung dann so schlecht ist.
Empfehlenswert ist der Artikel C is not actually a fully parseable language.
Wie der Einwand „Wenn eine Iteration 8-mal langsamer ist, dann bleibt es auch bei einer Milliarde Iterationen nur 8-mal langsamer“ zeigt,
ist die Zahl 158.000-fach logisch nicht stimmig.
Möglicherweise hat Register-Spilling den L3-Cache überlastet oder ein Bug führt dazu, dass unnötiger Code ausgeführt wird.
Einen C-Compiler zu bauen ist auch für Menschen schwierig,
aber das als Beleg für die Intelligenz eines LLM zu sehen, überzeugt nicht wirklich
Es handelt sich um ein bereits gut bekanntes Problem, und unzählige Implementierungen sowie Dokumentationen sind in den Trainingsdaten enthalten.
Das LLM hat also kein neues Design geschaffen, sondern bestehende Muster neu zusammengesetzt.
Trotzdem bleiben solche Werkzeuge nützlich,
und wirklich beeindruckend wird es erst dann, wenn ein Modell nicht nur bestehende OSS repliziert, sondern neue Ansätze vorschlägt.