3 Punkte von GN⁺ 2023-12-11 | 1 Kommentare | Auf WhatsApp teilen
  • Write Your Own Retro Compiler behandelt auf 339 Seiten einen selbsthostenden Compiler, der auf Z80-basiertem CP/M läuft und Code für dieselbe Umgebung erzeugt, einschließlich des vollständigen Quelltexts
  • T3X/0, die Zielsprache der Implementierung, ist eine einfache Sprache mit Wurzeln in Pascal und BCPL; im Buch ist ein vollständiges 20-seitiges Handbuch enthalten
  • Kenntnisse in prozeduralen Sprachen wie C oder Pascal sowie in Assemblersprache sind erforderlich; mit Grundwissen zu Z80-Assembler und CP/M lässt sich das Buch leichter nachvollziehen
  • Lexikalische Analyse, Parsing, Codegenerierung, einfache Optimierung, die BDOS-Schnittstelle und die Laufzeitbibliothek werden mit Diagrammen, Tabellen und Beispielen erklärt
  • Der gesamte Code wird als Public Domain bereitgestellt; außerdem werden Links zum Kauf des gedruckten Buchs und der PDF-Ausgabe, zum Inhaltsverzeichnis, zu Beispielseiten und zum Quellcode-Download veröffentlicht

Umfang und Zielgruppe des Buchs

  • Write Your Own Retro Compiler ist ein 2023 bei Lulu Press erschienenes Buch mit 339 Seiten, 91 Abbildungen und dem Format 6" x 9"
  • Das zentrale Thema ist ein selbsthostender Compiler, der unter CP/M auf dem Z80-Prozessor läuft und Code für dieselbe Umgebung erzeugt
  • Es ist so aufgebaut, dass man ihm auch ohne Erfahrung im Compilerbau folgen kann
  • Die Implementierungssprache T3X/0 ist eine einfache Sprache mit Wurzeln in Pascal und BCPL
  • Das Buch enthält ein vollständiges 20-seitiges Handbuch zu T3X/0

Erforderliche Kenntnisse

  • Mindestens eine prozedurale Programmiersprache sollte beherrscht werden
    • Als Beispiele werden C und Pascal genannt
  • Außerdem sollte mindestens eine Assemblersprache bekannt sein, idealerweise Assembler für die Z80-CPU
  • Grundkenntnisse des Betriebssystems CP/M werden ebenfalls vorausgesetzt
  • Für Leserinnen und Leser im Selbststudium ist eine kurze Einführung in die Z80-Assemblersprache enthalten

Komponenten des Compilers

  • Viele Diagramme, Tabellen und Beispiele erklären die interne Funktionsweise des Compilers
  • Behandelt werden folgende Themen
    • Lexikalische Analyse
    • Parsing
    • Codegenerierung
    • Einfache Optimierung
    • BDOS-Schnittstelle

      • Laufzeitbibliothek

Verfügbare Links und Code

1 Kommentare

 
GN⁺ 2023-12-11
Meinungen auf Hacker News
  • Habe ein neues Compiler-Buch veröffentlicht. Es ist eher eine erweiterte Ausgabe von „Write Your Own Compiler“, und diesmal geht es statt um ELF für moderne Systeme um Codegenerierung für CP/M auf dem Z80, wodurch vieles deutlich einfacher wird.
    Man kann sehen, wie viel Komplexität nötig ist, um einen Compiler zu bauen, der sich auf einem 4-MHz-Z80-System in unter 10 Minuten selbst kompiliert. Der Code ist kostenlos, das Buch ist kostenpflichtig.

    • Ich bin immer gespannt, was Nils baut. Ich hoffe, dass er damit auch geschäftlich profitabel ist, und irgendwann möchte ich alles kaufen und durcharbeiten.
      Außerdem würde ich gern ein schnörkelloses Buch über Forth und Nils’ Interpretation dazu sehen.
  • Ich habe kürzlich einen C-Multipass-Compiler und Assembler für solche alten x86-CPUs in TypeScript gebaut.
    https://github.com/Mati365/ts-c-compiler

    • Der Compiler im Buch zielt auf den etwas älteren Z80 ab, der nicht einmal Multiplikations- oder Divisionsbefehle hat. Trotzdem kann dieser Compiler auch Code für 8086 und 386 ausgeben.
  • Ich habe das gedruckte Buch der 2. Auflage von Practical Compiler Construction und mag es ziemlich. Wer sich dafür interessiert, dem empfehle ich Nils’ Bücher.

  • Dieses Buch sieht interessant aus. Ich warte allerdings immer noch auf einen echten Nachfolger von The Dragon Book.
    Schön wäre ein Buch, das moderne CPUs und möglichst auch GPU-Optimierung behandelt und außerdem zeigt, wie man eine moderne virtuelle Maschine mit schnellem, nebenläufigem Garbage Collector entwirft und schreibt. In mancher Hinsicht könnte das sogar schwieriger sein als das Schreiben eines Compilers.

    • Bob Morgans Building an Optimizing Compiler ist ein Buch, das sich vollständig auf moderne Compiler-Optimierung konzentriert, und es erschien 1997.
      Es behandelt den Aufbau von Kontrollflussgraphen, verschiedene darauf mögliche Optimierungen, Alias-Analyse, Static Single Assignment Form, CFG-Dominator-basierte Optimierungen, Instruction Scheduling, Register Allocation und die Erzeugung von Objektcode. Wie die meisten Compiler-Bücher behandelt es keine lexikalische Analyse, Syntaxanalyse oder NFA/DFA-Themen.
      Für Leute, die einen optimierenden Compiler mit fortgeschrittenen Analysen bauen wollen, dürfte auch Static Program Analysis hilfreich sein: https://cs.au.dk/~amoeller/spa/
      Für Garbage Collection gibt es das Garbage Collection Handbook: https://gchandbook.org/
    • Ich erinnere mich, dass ich The Dragon Book als Student nicht besonders mochte. Den Grund weiß ich nicht mehr genau, aber vermutlich fand ich die Struktur nicht gut, manche Themen zu detailliert und andere zu knapp erklärt.
      Wenn man schon ein gewisses Grundwissen hat, könnte einem diese Vorlesung gefallen: https://www.cs.cmu.edu/~janh/courses/411/18/schedule.html
      Besonders gut fand ich die Art, wie SSA-Form eingeführt wurde.
      Fortgeschrittenere Themen gibt es hier: https://www.cs.cmu.edu/~15745/handouts.html
    • Auf so ein Buch hoffe ich auch schon länger. Heutzutage ist durch Dinge wie moderne Mikrocodes/Firmware alles zu komplex geworden, und vieles wirkt wie Magie.
      Wenn sich etwas wie „Magie“ anfühlt, sehe ich das als Zeichen dafür, dass jemand eine Grenze, die man für gegeben hielt, geschickt umgangen hat. In letzter Zeit lese ich über Fake Bass, bei dem kleine Lautsprecher scheinbar tiefere Bässe erzeugen, als sie physisch eigentlich können; spannend ist, wie dabei Obertöne genutzt werden, um das Gehirn dazu zu bringen, einen tieferen Ton wahrzunehmen, als tatsächlich vorhanden ist.
  • Es sieht interessant aus, hat aber den Nachteil, dass Leser zuerst die neue Programmiersprache T3X kennen oder lernen müssen.
    Ich frage mich auch, ob man auf einem Retro-CP/M-System, dessen einzige Verbindung zur Außenwelt Tastatur und Bildschirm sind, einen Compiler von Grund auf schreiben und entwickeln könnte.

    • Darüber habe ich vor dem Schreiben des Buchs viel nachgedacht. Am Ende habe ich mich für T3X entschieden, weil der Compiler dafür deutlich kleiner ist als der kleinste C-Subset-Compiler und ich persönlich T3X für leichter zu lernen und zu verstehen halte.
      SubC hat 3815 Zeilen, T3X/0 hat 2330 Zeilen.
      Natürlich könnte man auch ohne externe Tools auf CP/M anfangen, aber dann müsste man den Bootstrap-Compiler in Assembler schreiben. Das ist zeitaufwendig, aber durchaus machbar. Ob das als Lesestoff interessant wäre, ist allerdings fraglich.
    • Das wirkt auf mich nicht wie ein Nachteil. Wer einen Compiler schreiben will, für den ist eine neue Programmiersprache wahrscheinlich kein großes Hindernis; eine einfache und saubere Toy Language kann für Lehrzwecke sogar besser sein.
      Dass sie keine C-artige Syntax, sondern eine ALGOL-artige Syntax verwendet, ist ein wenig überraschend, aber das könnte meine Voreingenommenheit sein. Im Kopf DO und END auf { und } abzubilden, ist keine große Belastung.
  • Ein Compiler-Tutorial, das über lexikalische Analyse und Syntaxanalyse hinausgeht — das ist ja fast das erste seiner Art, oder?
    Ein Scherz, aber tatsächlich hören viele Materialien genau dort auf. Das werde ich mir kaufen.

  • Ein Buch darüber, wie man sein eigenes CP/M-ähnliches Betriebssystem schreibt, wäre auch spannend.

    • Das ist Andrew Tanenbaums Operating Systems Design and Implementation.
      Es zeigt zwar, wie man ein Unix-artiges Mikrokernel-Betriebssystem baut, aber man muss einfach alles außer dem Kapitel zum Dateisystem überspringen. Außerdem sollte man den Rat zu Baum-Datenstrukturen ignorieren, nur flache Tabellen verwenden und sich nicht um eine exakte Implementierung der Dateigröße kümmern. Dann hat man CP/M.
      Persönlich bevorzuge ich die 2. Auflage. Die 3. Auflage wurde meiner Meinung nach unnötig komplex, weil der Demo-Code von Minix nicht mehr auf einem PC der 1980er, sondern auf einem PC der späten 1990er laufen sollte.
  • Das ist nicht negativ gemeint, sondern eine Beobachtung, die hilfreich sein könnte.
    Ich habe die kostenlosen Kapitel gelesen, und manches könnte für Leute ohne viel Vorwissen zum Thema schwierig sein. Unter den jeweiligen Überschriften werden Konzepte zunächst von Grund auf erklärt, etwa „Die Grammatik einer Sprache ist ...“, aber schon wenige Sätze später tauchen ohne Erklärung fortgeschrittenere Themen wie Assemblerbefehle auf.
    Wenn Leser noch lernen müssen, was eine Grammatik bedeutet, könnten die direkt folgenden Sätze schwer verständlich sein. Etwas mehr Konsistenz würde das Buch daher wohl runder machen.

    • Wie auch in der Buchbeschreibung steht, ist kein Vorwissen im Compilerbau nötig, aber ich bin davon ausgegangen, dass Leser mit mindestens einer prozeduralen Sprache und einer Assemblersprache vertraut sein sollten.
      Deshalb hielt ich es für in Ordnung, Dinge wie Assemblerbefehle als bekannt vorauszusetzen.
      Im Anhang des Buchs gibt es auch eine kurze Einführung in Z80-Assembler, aber auch sie setzt Grundlagen von Assemblersprachen voraus.
      Jedes Buch muss irgendwo anfangen. Es ist schwer, ein Buch über Compilerbau zu schreiben, wenn man keinerlei Programmierkenntnisse voraussetzt. Das heißt aber nicht, dass es keinen Fluch des Wissens gibt; diesen Punkt werde ich auf jeden Fall im Blick behalten.
  • Unabhängig vom eigentlichen Inhalt des Buchs gefällt mir auch das genau passende retrohafte und minimalistische Webdesign.
    Es löst starke Nostalgie aus. Es erinnert mich an gute Zeiten, als ich ein 6 Zoll dickes Buch mit einem Titel wie „HTML 3.2 UNLEASHED!!!!“ auf dem Schreibtisch liegen hatte und meine Websites von Hand baute.

    • Das waren gute Zeiten.
      Allerdings endet der Spaß, wenn man auf etwa 1500 statischen Seiten eine globale Änderung anwenden will. Der Schmerz ist noch nicht groß genug, dass ich dafür ein eigenes CMS bauen würde, aber selbst wenn, würde ich das Design so lassen.
  • https://web.archive.org/web/20231210141834/http://t3x.org/t3...