Übersicht
2 Was ist ein Compiler? Frontend Analyse Backend Synthese Compiler-Pässe
3 Was ist ein Compiler? Frontend (Eingabesprache) Analyse Backend (Ausgabesprache) Synthese
4 Was ist ein Compiler? Frontend (Eingabesprache) Syntaxanalyse (Parser) statische Semantik (well-formedness) "Middle-end" (interne Repräsentation) Transformationen Backend (Ausgabesprache) Codegenerierung
Was ist ein Compiler? 2008 Martin v. Löwis Frontend (Eingabesprache) Syntaxanalyse (Parser) statische Semantik (well-formedness) Namensauflösung "Middle-end" (interne Repräsentation) Transformationen: Optimierung (target-unhabhängg) Kontrollflussanalyse Datenflussanalyse Backend (Ausgabesprache) Codegenerierung Optimierung (target-abhängig) Registerallokation peep-hole optimizer spezielle Maschinenbefehle 5
Beispiel eines modularen Compilers: GCC 2008 Martin v. Löwis Front-Ends: C, C++, Pascal, Java, (.NET),... Interne Repräsentation 1: tree nodes (abstrakte Syntaxbäume) SSA-Form (Single Static Assignment): GENERIC und GIMPLE Middle-End-Optimierungen: dead code elimination partial redundancy elimination global value numbering sparse conditional constant propagation... Back-Ends: x86, SPARC, PPC, ARM, MIPS,... interne Repräsentation 2: RTL (Register Transfer Language) 6
Phoenix 2008 Martin v. Löwis Microsoft-Compiler-Framework,.NET-basiert für Compiler und ähnliche Werkzeuge (zur Programmanalyse, Optimierung, Test) Keine Unterstützung für Parser-Bau, gegenwärtig keine Unterstützung für Backends: Fokus auf "Middle-End) Modulare Architektur verschiedene interne Repräsentation, erweiterbare Architektur für Compilerpässe Beispielanwendungen (Quelle: Phoenix-Dokumentation): Basic Block Analysis Memory Tracing Code coverage Fault injection Ahead-of-time and Just-in-Time compilers Whole-program, post-link, and runtime optimization 7
8 Phoenix: Teilfunktionen Readers: CIL, MSIL, COFF,.exe,.pdb Writers: CIL, MSIL, COFF,.exe,.pdb Interne Repräsentationen: HIR, MIR, LIR HIR: unabhängig von Laufzeitsystem MIR: unabhängig von Zielarchitektur LIR: abhängig von Zielarchitektur zusätzlich: Symbole, Funktionen, Flussgraphen,... Pässe: Reader, TypeCheck, BuildCallGraphNodes, DeadStores, StackAllocate, Lower, Writer,...
9 Phoenix: Features Alias-Analyse Datenflussanalyse statische Analyse simulationsbasierte Analyse SSA Integration mit MSVC C Compiler (cl.exe)
10 Projektarbeit Teams von bis zu 4 Studenten zweiwöchentliche Konsultationen, Abschlussvortrag, Ausarbeitungen Thema jeweils entweder Frontend, Middleend, Backend Front-End: z.b. Java-nach-.NET-Compiler Middle-End: z.b. Whole Program Analysis Back-End: z.b. SPARC-Generator (für C-Compiler)
11 Java-Compiler Scanner, Parser: z.b. ANTLR yacc etc. auch möglich, aber: Integration mit C#/Managed C++ statische Semantik/wellformedness? Synthese: Schritt 1: Phoenix HIR Schritt 2: Phoenix macht den Rest?!?
Whole-Program-Analysis 2008 Martin v. Löwis Einlesen eines ganzen Programms (Haupt-Assembly, main) Rekursive Erkennung benutzter Teile: Problem: Virtuelle Methodenrufe statisch schwer analysierbar Löschung unbenutzter Klassen und Methoden eventuell auch Löschung sonstigen toten Codes, mit Phoenix-Hilfe Lösung: Löschung ganzer Klassen löscht u.u. auch virtuelle Funktionen; Wiederholung bis zum Fixpunkt Speichern neuer Assemblies evtl: Integration mehrerer Assemblies in eine siehe auch Masterarbeit Florian Wonneberg 12
SPARC-Generator 2008 Martin v. Löwis Phoenix: deklarative Backend-Entwicklung Deklaration von Registern, Befehlen, evtl. Funktionseinheiten auf dem Chip (für "instruction scheduling"), etc. bisher nicht öffentlich verfügbar naive Implementierung: sequentielles Traversieren von MIR/LIR Annahme: alle Variablen im Hauptspeicher Registerverwendung nur für einzelne MIR-Befehle Zielsystem: Solaris Calling Conventions Integration in MSC: Phoenix implementiert c2.dll 13
14 Literatur Aho, (Lam), Sethi, Ullman: Compilers