10 Punkte von GN⁺ 2023-09-05 | 1 Kommentare | Auf WhatsApp teilen
  • Der Autor stellte sich der schwierigen Herausforderung, einen C-Compiler in 500 Zeilen Python-Code zu schreiben.
  • Der Compiler arbeitet in einem einzigen Durchlauf und erzeugt den Code bereits beim Parsen, anders als übliche Zwei-Pass-Compiler, die zunächst einen Syntaxbaum aufbauen und ihn dann in Maschinencode umwandeln.
  • Der Compiler zielt auf WebAssembly ab; diese Entscheidung entstand eher aus Neugier als aus praktischen Erwägungen. Hervorgehoben werden die besonderen Herausforderungen von WebAssembly, etwa das Fehlen von Registern und die Nutzung einer Stack-Maschine.
  • Aufgrund der Beschränkung auf 500 Zeilen unterstützt der Compiler bestimmte C-Funktionen nicht, darunter Strukturen, Enumerationen, Unions, Präprozessor-Direktiven, Gleitkommazahlen und 8-Byte-Typen.
  • Der Compiler besteht 34 von 220 Testfällen der c-testsuite und kann ein Programm zur Berechnung der Fibonacci-Folge erfolgreich kompilieren und ausführen.
  • Der Beitrag bietet eine detaillierte Analyse des Compiler-Codes und erklärt, wie verschiedene Aspekte der C-Syntax verarbeitet werden und welche Schwierigkeiten bei der Arbeit mit WebAssembly auftreten.
  • Trotz der Komplexität eines Compilers zeigt er, dass das Ergebnis überraschend kompakt sein kann, wenn man Abstriche bei der Codequalität macht und alles in einem einzigen Durchlauf erledigt.
  • Es wird vorgeschlagen, dass solche Single-Pass-Compiler wegen ihrer Kompaktheit hervorragend als stage0 für selbsthostende Sprachen geeignet sein könnten.
  • Die Zeilenanzahl des Codes wurde mit dem Tool sloccount gemessen, wobei Kommentare, Docstrings und Leerraum ausgeschlossen wurden.

1 Kommentare

 
GN⁺ 2023-09-05
Hacker-News-Kommentare
  • Ein Artikel über die Erstellung eines C-Compilers in 500 Zeilen Python, verglichen mit dem 1978 veröffentlichten Tiny-Pascal-Compiler
  • Der Compiler arbeitet in einem Single-Pass; die Codegenerierung erfolgt während des Parsens, eine Funktion, die speziell für C entwickelt wurde, um den begrenzten Speicher früher Computer zu berücksichtigen
  • Der Nutzen, einen eigenen Compiler zu schreiben, besteht darin, Compiler, Interpreter, Linker/Loader und verwandte Systemsoftware zu verstehen, Debugging-Aufwand zu unterstützen und das technische Niveau von Entwicklern zu verbessern
  • Dieses Projekt ähnelt anderen Projekten, etwa einem TypeScript-Projekt, das x86-Assembly erzeugt, diese zu Binärcode kompiliert und ausführt
  • Der Artikel wird für seine klare Erklärung gelobt und gilt als unterhaltsame Herausforderung im Bereich merkwürdiger Programmiersprachen (esolangs)
  • Einen C-Compiler in 500 Zeilen gut verständlichem Code zu schreiben, wird selbst für erfahrene Entwickler als bedeutende Herausforderung angesehen, die mehrere Monate Arbeit erfordern kann
  • Der Artikel weckt Neugier auf andere kleine Compiler, etwa einen Scheme-to-WASM-Compiler
  • Zum Vergleich erwähnt der Artikel die Anzahl der Codezeilen (LOCs) anderer kleiner C- oder C-ähnlicher Compiler, darunter Ritchies frühester struct-Compiler und der v7-Unix-C-Compiler