Zwischendarstellung und Compiler-Optimierung
Kurz: Moderne Compiler übersetzen den Syntaxbaum in eine Zwischendarstellung (IR), optimieren sie unabhängig von Sprache und Zielprozessor und erzeugen erst dann Maschinencode.
Genauer: Eine IR wie LLVM-IR ist maschinennah, aber prozessorunabhängig. So müssen für m Sprachen und n Prozessoren nur m Frontends und n Backends geschrieben werden statt m·n Compiler. In SSA-Form wird jede Variable genau einmal zugewiesen, was viele Optimierungen vereinfacht.
Im Detail
- Optimierungen: Konstantenfaltung, Inlining, Entfernen toten Codes, Schleifenoptimierungen, Vektorisierung.
- Inlining: Funktionsaufruf durch Funktionsrumpf ersetzen. Spart Aufrufkosten, öffnet weitere Optimierungen.
- Registerzuteilung: Variablen auf wenige CPU-Register abbilden.
- Backend: Befehlsauswahl und Anordnung für den Zielprozessor.
- Profile-Guided Optimization: Optimiert anhand echter Messdaten.
- JIT-Compiler: Übersetzt zur Laufzeit und nutzt Wissen über tatsächliches Verhalten (z. B. V8, HotSpot).
- Ahead-of-Time: Alles vorher (C, Rust, Go).
Siehe auch: Lexer, Parser und Syntaxbaum, Linker und Lader