PolymathicAlle Ideen →
Informatik & KI

Compiler & Interpreter

Wie aus Text ein laufendes Programm wird — lexen, parsen, durchlaufen. Jeder baut darauf; wenige schauen hinein.

Im Jahr 1957 veröffentlichte ein IBM-Team unter Leitung von John Backus FORTRAN — die erste Hochsprache mit ernstzunehmendem Compiler. Das Team hatte drei Jahre daran gearbeitet, und das Ergebnis war konkurrenzfähig mit handgeschriebenem Assembler, was die meisten Programmierer der Zeit für unmöglich gehalten hatten. Der Durchbruch hat das Programmieren neu definiert: statt Maschinenbefehle schrieb man mathematische Formeln, und der Compiler übersetzte. Innerhalb eines Jahrzehnts folgten Dutzende Sprachen, parallel wurde das theoretische Fundament gelegt — formale Grammatiken (nach Chomsky 1956), Parsing-Algorithmen, Typsysteme, Optimierungstheorie. Das Drachenbuch von Aho und Ullman von 1986 fixierte die kanonische Pädagogik. Achtundsechzig Jahre später ist dieselbe Pipeline — Lexen, Parsen, Typprüfen, Optimieren, Codegenerierung — noch immer das, was jeder Compiler tut.

Jeder moderne Compiler ist um im Wesentlichen dieselbe sechsstufige Pipeline gebaut. Die lexikalische Analyse (getrieben von regulären Ausdrücken und einem endlichen Automaten) liest den Quelltext und liefert einen Strom von Tokens; das Parsen verwandelt diesen Strom mithilfe einer kontextfreien Grammatik in einen abstrakten Syntaxbaum — meist über einen Top-down-Recursive-Descent-Parser (so gehen Clang und rustc vor) oder einen Bottom-up-LR-Parser (yacc, bison); die semantische Analyse durchläuft den Baum, baut eine Symboltabelle auf und prüft auf Konsistenz. Moderne Compiler erweitern die semantische Analyse um Typinferenz: der Hindley-Milner-Algorithmus von 1978 ist das Fundament, sichtbar in ML, Haskell, OCaml und in abgewandelter Form in Rust, Scala, TypeScript. Eine Zwischenrepräsentation — typischerweise Drei-Adressen-Code oder Static-Single-Assignment-Form (SSA) — macht das Programm leichter optimierbar, und LLVM IR ist zum dominanten heutigen Ziel geworden: Sprachen übersetzen nach LLVM IR und erben dessen Optimierungspässe kostenlos. Die Optimierung lässt Dutzende Pässe laufen — Konstantenfaltung, Beseitigung toten Codes, gemeinsame Teilausdrücke, Schleifenausrollen, Funktionsinlining, Registerzuteilung —, bevor die Codegenerierung Maschinencode für x86-64, ARM oder RISC-V emittiert oder einen Bytecode (JVM, .NET CLR, WebAssembly), den eine virtuelle Maschine später interpretiert oder JIT-kompiliert. Die Unterscheidung Compiler gegen Interpreter ist verschwommen: die meisten sogenannten interpretierten Sprachen (Python, Ruby, JavaScript) übersetzen in Wirklichkeit in Bytecode und führen ihn auf einer VM aus, und Just-in-Time-Kompilierung (Java HotSpot, V8, der neue CPython-JIT) interpretiert zunächst und kompiliert heiße Pfade zur Laufzeit zu Maschinencode, oft innerhalb eines Faktors zwei gegenüber Ahead-of-Time-Builds. Das Typsystem ist der Hebel, der entscheidet, welche Fehler der Compiler vor dem Lauf abfängt: statische Systeme (Java, C++, Rust, TypeScript, Haskell) fangen sie zur Compile-Zeit ab; dynamische (untypisiertes Python, Ruby, JavaScript) zur Laufzeit; abhängige Typen (Coq, Agda, Lean) lassen Typen von Werten abhängen und Aussagen wie diese Liste ist nicht leer beweisen; affine Systeme (Rusts Borrow-Checker) verhindern Ressourcenfehler durch Konstruktion.

Warum es jetzt zählt

LLVM, im Jahr 2000 von Chris Lattner als Doktorarbeit begonnen, ist heute die dominante Open-Source-Compilerinfrastruktur — Clang, rustc, Swift, Julia und Dutzende weitere zielen darauf —, während GCC die Linux-Kernel-Entwicklung trägt und V8 das Browser- und Node-Ökosystem antreibt. WebAssembly (2017) lässt kompiliertes C, C++, Rust und Go nahezu nativ schnell in Browsern und Server-Laufzeiten laufen — eine der folgenreichsten Systemsoftware-Entwicklungen des vergangenen Jahrzehnts. Der Compiler-Stack ist überdies zum Substrat der KI-Revolution geworden: XLA, MLIR, TVM, TensorRT und NVIDIAs CUDA übersetzen hochsprachigen Python-ML-Code in optimierte GPU-Kernels, und die Performance von Frontier-LLMs hängt entscheidend davon ab, wie gut diese Compiler ihre Arbeit machen. KI-gestütztes Programmieren (Copilot, Cursor, Claude Code) sitzt obenauf und produziert Quelltext, den der klassische Compiler dann zu Maschinencode macht — ob das LLM den Hochsprachenschritt am Ende verdrängt, ist eine offene Forschungsfrage.

In Polymathic lesen →Den Katalog durchstöbern
Polymathic — ein kuratierter Katalog der Ideen, die es wert sind, behalten zu werden, quer durch zwölf Disziplinen. polymathic.app