Eine Compiler-Schreibreise
In diesem Github-Repository dokumentiere ich meinen Weg, einen selbstkompilierenden Compiler für eine Teilmenge der C-Sprache zu schreiben. Ich schreibe auch die Details auf, damit Sie, wenn Sie mitmachen möchten, eine Erklärung darüber erhalten, was ich getan habe, warum, und einige Verweise auf die Theorie der Compiler enthalten.
Aber nicht zu viel Theorie, ich möchte, dass dies eine praktische Reise wird.
Hier sind die Schritte, die ich bisher unternommen habe:
- Teil 0: Einführung in die Reise
- Teil 1: Einführung in das lexikalische Scannen
- Teil 2: Einführung in das Parsen
- Teil 3: Vorrang des Bedieners
- Teil 4: Ein tatsächlicher Compiler
- Teil 5: Aussagen
- Teil 6: Variablen
- Teil 7: Vergleichsoperatoren
- Teil 8: If-Anweisungen
- Teil 9: While-Schleifen
- Teil 10: For-Schleifen
- Teil 11: Funktionen, Teil 1
- Teil 12: Typen, Teil 1
- Teil 13: Funktionen, Teil 2
- Teil 14: Generieren von ARM-Assembly-Code
- Teil 15: Hinweise, Teil 1
- Teil 16: Globale Variablen richtig deklarieren
- Teil 17: Bessere Typprüfung und Zeiger-Offsets
- Teil 18: L-Werte und R-Werte überarbeitet
- Teil 19: Arrays, Teil 1
- Teil 20: Zeichen- und String-Literale
- Teil 21: Weitere Operatoren
- Teil 22: Designideen für lokale Variablen und Funktionsaufrufe
- Teil 23: Lokale Variablen
- Teil 24: Funktionsparameter
- Teil 25: Funktionsaufrufe und Argumente
- Teil 26: Funktionsprototypen
- Teil 27: Regressionstests und eine schöne Überraschung
- Teil 28: Weitere Laufzeitflags hinzufügen
- Teil 29: Ein bisschen Refactoring
- Teil 30: Entwerfen von Strukturen, Unions und Aufzählungen
- Teil 31: Strukturen implementieren, Teil 1
- Teil 32: Zugriff auf Mitglieder in einer Struktur
- Teil 33: Implementierung von Gewerkschaften und Mitgliederzugang
- Teil 34: Enums und Typedefs
- Teil 35: Der C-Präprozessor
- Teil 36:
break
und continue
- Teil 37: Switch-Anweisungen
- Teil 38: Dangling Else und mehr
- Teil 39: Variableninitialisierung, Teil 1
- Teil 40: Globale Variableninitialisierung
- Teil 41: Initialisierung lokaler Variablen
- Teil 42: Typumwandlung und NULL
- Teil 43: Fehlerbehebungen und weitere Operatoren
- Teil 44: Ständiges Falten
- Teil 45: Globale Variablendeklarationen, überarbeitet
- Teil 46: Void-Funktionsparameter und Scanänderungen
- Teil 47: Eine Teilmenge von
sizeof
- Teil 48: Eine Teilmenge der
static
- Teil 49: Der ternäre Operator
- Teil 50: Aufwischen, Teil 1
- Teil 51: Arrays, Teil 2
- Teil 52: Hinweise, Teil 2
- Teil 53: Aufräumen, Teil 2
- Teil 54: Überlaufregister
- Teil 55: Faule Bewertung
- Teil 56: Lokale Arrays
- Teil 57: Aufwischen, Teil 3
- Teil 58: Zeigerinkremente/-dekremente korrigieren
- Teil 59: Warum funktioniert es nicht, Teil 1
- Teil 60: Bestehen des Dreifachtests
- Teil 61: Wie geht es weiter?
- Teil 62: Codebereinigung
- Teil 63: Ein neues Backend mit QBE
- Teil 64: Ein Backend für die 6809-CPU
Es gibt keinen Zeitplan oder Zeitplan für die zukünftigen Teile. Schauen Sie also immer wieder hier vorbei, um zu sehen, ob ich noch mehr geschrieben habe.
Urheberrechte
Ich habe einen Teil des Codes und viele Ideen vom SubC-Compiler von Nils M. Holm ausgeliehen. Sein Code ist gemeinfrei. Ich denke, dass sich mein Code wesentlich genug unterscheidet, dass ich eine andere Lizenz auf meinen Code anwenden kann.
Sofern nicht anders angegeben,
- Alle Quellcodes und Skripte sind (c) Warren Toomey unter der GPL3-Lizenz.
- Alle Nicht-Quellcode-Dokumente (z. B. englische Dokumente, Bilddateien) sind (c) Warren Toomey unter der Creative Commons BY-NC-SA 4.0-Lizenz.