Compiler und Implementierung
Compilerbau und Sprachimplementierung wandeln High-Level-Programme in ausführbaren Code um, wobei Analyse, Übersetzung, Optimierung und Laufzeitunterstützung abgedeckt werden.
Definition
Compilerbau und Sprachimplementierung umfassen die Techniken zur Übersetzung von Programmen, die in einer Quellsprache geschrieben sind, in eine Form, die effizient ausgeführt werden kann, zusammen mit der erforderlichen Laufzeitinfrastruktur zur Unterstützung dieser Ausführung.
Scope
Dieser Bereich umfasst das Engineering und die Theorie der Implementierung von Programmiersprachen: lexikalische und syntaktische Analyse, semantische Analyse, Zwischenrepräsentationen, Codegenerierung und -optimierung sowie die Laufzeitsysteme, virtuellen Maschinen und Speicherverwaltungen, die die Ausführung unterstützen. Er behandelt sowohl die Ahead-of-Time- als auch die Just-in-Time-Kompilierung und das Zusammenspiel zwischen Sprachdesign und effizienter Implementierung.
Sub-topics
Core questions
- Wie wird Quelltext in effizienten ausführbaren Code umgewandelt?
- Welche Zwischenrepräsentationen unterstützen Analyse und Optimierung am besten?
- Wie bewahren Optimierungen die Programmbedeutung, während sie die Leistung verbessern?
- Welche Laufzeit- und Speicherverwaltungsunterstützung benötigt eine Sprache?
Key theories
- Die klassische Compiler-Pipeline
- Das Dragon Book organisiert die Kompilierung in Phasen (Lexing, Parsing, semantische Analyse, Zwischencode, Optimierung, Codegenerierung) und etabliert damit die Standardarchitektur moderner Compiler.
- Wiederverwendbare Compiler-Infrastruktur (LLVM)
- Lattner und Adve führten ein Compiler-Framework ein, das auf einer typisierten Zwischenrepräsentation basiert und Analyse und Transformation über Kompilierzeit, Linkzeit und Laufzeit hinweg unterstützt.
- Moderne Compiler-Design-Methodik
- Appel und Muchnick präsentieren strukturierte, datenfluss- und SSA-basierte Ansätze zum Bau optimierender Compiler, die die in Produktions-Toolchains verwendeten Algorithmen kodifizieren.
Clinical relevance
Compiler sind eine zentrale Infrastruktur: Ihre Korrektheit und die Qualität ihrer Optimierungen beeinflussen direkt die Zuverlässigkeit und Leistung praktisch aller Software. Wiederverwendbare Frameworks wie LLVM haben die Kosten für die Entwicklung neuer Sprachen und die Zielausrichtung auf neue Hardware gesenkt.
History
Die Compilertechnologie begann in den 1950er Jahren mit dem optimierenden Compiler von Fortran. Formale Parsing-Theorie (LL, LR) und Datenflussanalyse reiften in den 1960er und 1970er Jahren und wurden im Dragon Book von 1986 kodifiziert. Die statische Single-Assignment-Form und aggressive Optimierung entwickelten sich in den 1990er Jahren weiter, und in den 2000er Jahren entstanden wiederverwendbare Infrastrukturen wie LLVM und die weit verbreitete Just-in-Time-Kompilierung.
Debates
- Ahead-of-Time- versus Just-in-Time-Kompilierung
- Implementierer wägen die Ahead-of-Time-Kompilierung, die die Optimierung vorverlagert und einen vorhersehbaren Start ermöglicht, gegen die Just-in-Time-Kompilierung ab, die Laufzeitprofile nutzen kann, aber Aufwärm- und Laufzeit-Overhead hinzufügt.
Key figures
- Alfred Aho
- Jeffrey Ullman
- Andrew Appel
- Chris Lattner
- Frances Allen
Related topics
Seminal works
- aho2006
- appel1998
- muchnick1997
- lattner2004
Frequently asked questions
- Was sind die Hauptphasen eines Compilers?
- Ein typischer Compiler führt lexikalische Analyse, Parsing, semantische Analyse, Zwischencode-Generierung, Optimierung und Zielcode-Generierung durch, oft als Frontend, Middle-End und Backend beschrieben.
- Was ist der Unterschied zwischen einem Compiler und einem Interpreter?
- Ein Compiler übersetzt ein Programm vor der Ausführung in eine andere Form (z. B. Maschinencode), während ein Interpreter das Programm direkt ausführt; viele moderne Systeme kombinieren beides, zum Beispiel durch Just-in-Time-Kompilierung.