Technische Universität Dortmund

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

Vorlesung Compilertechnik Sommersemester 2008
Eine dynamische Menge, die diese Operationen unterstützt,
Informatik 12 | DAES Compilerbau Wintersemester 2010 / 2011 Dr. Heiko Falk Technische Universität Dortmund Lehrstuhl Informatik 12 Entwurfsautomatisierung.
Technische Universität Dortmund
3. Kapitel: Komplexität und Komplexitätsklassen
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister)
5. Sortier-Algorithmen Vorbemerkungen:
Kapitel 4 Datenstrukturen
Technische Universität Dortmund
Imperative Programmierung
der Universität Oldenburg
Einführung in Berechenbarkeit und Formale Sprachen
1 Energiebewusste Compilierung für digitale Signalprozessoren Markus Lorenz Peter Marwedel Universität Dortmund Lehrstuhl Informatik XII Projekt Prozessorarchitekturen.
0 Energieeffiziente Compilierung für Digitale Signalprozessoren Markus Lorenz Peter Marwedel Rainer Leupers Projekt Prozessorarchitekturen und Compilertechniken.
Kapitel 4 Syntaktische Analyse: LR Parsing.
Modellbasierte Software- Entwicklung eingebetteter Systeme Prof. Dr. Holger Schlingloff Institut für Informatik der Humboldt Universität und Fraunhofer.
Parser generieren Yet Another Compiler – Compiler YACC.
Java: Objektorientierte Programmierung
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (27-Selbstanordnende lineare Listen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 16 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Imperative Programmierung
2.5. Mikrocontroller-Komponenten
Agenda Motivation Formale Sprachen Compiler Compilerentwicklung
Grundlegende Analysen & Zwischendarstellungen
Christian Schindelhauer
Von der Sprache zum Programm
Folie 1 Reengineering-Werkzeugen für Webseiten Johannes Martin, University of Victoria Ludger Martin, Technische Universität Darmstadt WSR 2001 Bad Honnef,
Programmiersprachen II Integration verschiedener Datenstrukturen
Einführung in die Programmierung Wintersemester 2013/14 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Copyright 2011 Bernd Brügge, Christian Herzog Grundlagen der Programmierung TUM Wintersemester 2011/12 Kapitel 11, Folie 1 2 Dr. Christian Herzog Technische.
Einführung in die Programmierung
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2013/14 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Formale Sprachen Teil 3 Klaus Becker Syntax und Semantik.
Städtisches Gymnasium Beverungen Friedel Berlage
Grundlagen der Übersetzung und Optimierung von Programmiersprachen
Analyse der Laufzeit von Algorithmen
Agenda Motivation und Einordnung Syntaxgerichtete Übersetzung
Mensch – Maschine - Kommunikation
7. Formale Sprachen und Grammatiken
Inhalt Einordnung und Funktion der lexikalische Analyse Grundlagen
Semantische Analyse und attributierte Grammatiken
Modellbasierte Software- Entwicklung eingebetteter Systeme Prof. Dr. Holger Schlingloff Institut für Informatik der Humboldt Universität und Fraunhofer.
Anmerkung des Autor Diese Präsentation ist mit Powerpoint für MacOS erstellt. Leider ist sie nicht vollständig mit Powerpoint für Windows kompatibel.
Programmiersprachen II Fortsetzung Datenstrukturen Balancierte Bäume 2 Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Vortrag Einführung in AspectJ. Gliederung 1 Einleitung 2 Querschnittsfunktionalitäten in AspectJ 2.1 Sprachelemente 3 Beispiel 4 Join Point Modell 5 Weaving.
Strukturen (Eigenschaften) Strukturen dienen zur Zusammenfassung mehrerer Komponenten verschiedener Typen zu einer Einheit, die dann mit gemeinsamen Namen.
Compiler für Eingebettete Systeme [CS7506]
Compiler für Eingebettete Systeme [CS7506]
Compiler für Eingebettete Systeme [CS7506]
 Präsentation transkript:

Technische Universität Dortmund Compilerbau Wintersemester 2010 / 2011 Dr. Heiko Falk Technische Universität Dortmund Lehrstuhl Informatik 12 Entwurfsautomatisierung für Eingebettete Systeme

Interner Aufbau von Compilern Kapitel 2 Interner Aufbau von Compilern Folie 2 / 30

Gliederung der Vorlesung Kapitel 1: Compiler – Abhängigkeiten und Anforderungen Kapitel 2: Interner Aufbau von Compilern Compilerphasen Strukturen Optimierender Compiler Zielfunktionen von Code-Optimierungen Kapitel 3: Lexikalische Analyse (Scanner) Kapitel 4: Syntaktische Analyse (Parser) Kapitel 5: Semantische Analyse Kapitel 6: Instruktionsauswahl Kapitel 7: Register-Allokation Kapitel 8: Code-Optimierung Kapitel 9: Ausblick Folie 3 / 30

Das Frontend (Analysephase) Lexikalische Analyse Token- Folge Quell- Code Lexikalische Analyse (Scanner): Zerlegung des Quellprogramms in lexikalische Einheiten (Token) Erkennung von Token (reguläre Ausdrücke, endliche Automaten) Token: Repräsentieren Zeichenfolgen von Bedeutung in der Quellsprache (z.B. Bezeichner, Konstanten, Schlüsselworte) Folie 4 / 30

Das Frontend (Analysephase) Lexikalische Analyse Token- Folge Syntaktische Analyse Syntax- Baum Quell- Code Syntaktische Analyse (Parser): Sei G Grammatik der Quellsprache Entscheidung, ob Tokenfolge aus G ableitbar ist. Syntaxbaum: Baumförmige Darstellung des Codes anhand während Ableitung benutzter Regeln aus G Fehlerbehandlung Folie 5 / 30

Das Frontend (Analysephase) Lexikalische Analyse Token- Folge Syntaktische Analyse Syntax- Baum Semantische Analyse IR Quell- Code Semantische Analyse (IR Generator): Namensanalyse (z.B. Gültigkeitsbereiche von Symbolen) Prüfung, dass jeder Ausdruck korrekten Typs ist (Typanalyse) Aufbau von Symboltabellen (Abbildung von Bezeichnern zu deren Typen und Positionen) Erzeugung einer Internen Zwischendarstellung (Intermediate Representation, IR) zur weiteren Verarbeitung Folie 6 / 30

Das Backend (Synthesephase) IR Instruktions- Auswahl Virtueller Code Instruktionsauswahl (Code Selector): Auswahl von Maschinenbefehlen zur Implementierung einer IR Oft – Generierung von Virtuellem Code: Nicht lauffähiger Assemblercode; Annahme unendlich vieler Virtueller Register, anstatt begrenzt vieler Physikalischer Register Alternativ – Generierung von Code mit Stack-Zugriffen: Lauffähiger Assemblercode; sehr eingeschränkte Nutzung von Registern; Variablen werden im Speicher gehalten (Bsp.: GCC) Folie 7 / 30

Das Backend (Synthesephase) IR Instruktions- Auswahl Virtueller Code Register- Allokation ASM Code Registerallokation: Entweder: Abbildung Virtueller auf Physikalische Register Oder: Ersetzen von Stack-Zugriffen durch Speicherung von Daten in Registern Einfügen von Speicher-Transfers (Aus-/Einlagern, Spilling), falls zu wenig physikalische Register vorhanden Folie 8 / 30

Das Backend (Synthesephase) IR Instruktions- Auswahl Virtueller Code Register- Allokation ASM Code Instruktions- Anordnung ASM Code Instruktionsanordnung (Scheduler): Umordnen von Maschinenbefehlen zur Erhöhung der Parallelität Abhängigkeitsanalyse zwischen Maschinenbefehlen (Daten- & Kontroll-Abhängigkeiten) Folie 9 / 30

Aufbau eines einfachen Compilers Lexikalische Analyse Token- Folge Syntaktische Analyse Syntax- Baum Semantische Analyse IR Quell- Code Instruktions- Auswahl Virtueller Code Register- Allokation ASM Code Instruktions- Anordnung ASM Code Wo finden in diesem Compiler nun Code-Optimierungen statt? Folie 10 / 30

Gliederung der Vorlesung Kapitel 1: Compiler – Abhängigkeiten und Anforderungen Kapitel 2: Interner Aufbau von Compilern Compilerphasen Strukturen Optimierender Compiler Zielfunktionen von Code-Optimierungen Kapitel 3: Lexikalische Analyse (Scanner) Kapitel 4: Syntaktische Analyse (Parser) Kapitel 5: Semantische Analyse Kapitel 6: Instruktionsauswahl Kapitel 7: Register-Allokation Kapitel 8: Code-Optimierung Kapitel 9: Ausblick Folie 11 / 30

Begriff „Code-Optimierung“ Definition (Optimierung): Compilerphase, die Code einliest, ändert und ausgibt. Code-Änderung erfolgt mit Ziel der Verbesserung des Codes. Bemerkungen: Optimierungen erzeugen i.d.R. keinen optimalen Code (oft unentscheidbar), sondern (hoffentlich) besseren Code. Code-Verbesserung erfolgt bzgl. einer Zielfunktion. Folie 12 / 30

Infrastruktur zur Code-Optimierung Vorhandensein formaler Code-Analysen: Code-Änderungen müssen wieder zu korrektem Code führen. Optimierung muss entscheiden, wann Änderungen am Code vorgenommen werden dürfen, und wann nicht. Formale Code-Analysen helfen bei dieser Entscheidung. Beispiele: Kontroll- & Datenflussanalyse, Abhängigkeitsanalyse, ... Intermediate Representations (IRs): Interne Datenstrukturen des Compilers, die zu übersetzenden bzw. zu optimierenden Code repräsentieren. ( Kapitel 5) Gute IRs stellen zusätzlich zur Optimierung benötigte Code-Analysen bereit. Folie 13 / 30

Aufbau eines optimierenden Compilers Lexikalische Analyse Token- Folge Syntaktische Analyse Syntax- Baum Semantische Analyse Quell- Code Code-Opti- mierung IR Instruktions- Auswahl Virtueller Code Register- Allokation ASM Code Instruktions- Anordnung ASM Code Folie 14 / 30

Alternative Compiler-Strukturen (1) Standardcompiler für Desktop- bzw. Server-Systeme: Können oft mehrere Quellsprachen übersetzen (z.B. C, C++, Java, Pascal, …). Benötigen daher mehrere Frontends, pro Quellsprache eines. Können oft Maschinencode für mehrere Zielprozessoren erzeugen (z.B. für i386, x86_64, sparc v8, sparc v9, ppc, …). Benötigen daher mehrere Backends, pro Zielarchitektur eines. Informationsaustausch zwischen n Frontends und m Backends erfolgt über zentrale Schnittstelle, nämlich die IR des Compilers. Diese abstrahiert hinreichend von den diversen Quellsprachen und Prozessoren weg. Folie 15 / 30

Alternative Compiler-Strukturen (2) Standardcompiler für Desktop- bzw. Server-Systeme: Frontend 1 Frontend 2 Frontend n … Code-Opti- mierung IR Backend 1 Backend 2 Backend m … Beispiele: GNU Compiler Collection GCC Sun Studio Compiler LLVM Folie 16 / 30

Alternative Compiler-Strukturen (3) Compiler für Eingebettete Systeme: Spezialcompiler, die hohe Flexibilität der Standardcompiler bzgl. verschiedener Quellsprachen und Zielprozessoren nicht brauchen. ANSI-C als Quellsprache im Bereich Eingebetteter Systeme etablierter „de facto-Standard“. Ein ANSI-C Frontend genügt. Es genügt i.d.R. auch ein Backend, da Code nur für fest vorgegebene Zielarchitektur zu erzeugen ist. Compiler für Eingebettete Systeme sind nicht auf maximale Flexibilität ausgerichtet, sondern auf hoch-optimierten Code. Massive Code-Optimierung mit Hilfe mehrer IRs. Folie 17 / 30

Alternative Compiler-Strukturen (4) Compiler für Eingebettete Systeme: Instruktions- Auswahl Frontend IR 1 Code-Opti- mierungen IR 2 Instruktions- Anordnung Register- Allokation ASM Code Beispiel: WCET-Aware C Compiler WCC http://ls12-www.cs.tu-dortmund.de/research/activities/wcc Folie 18 / 30

Gliederung der Vorlesung Kapitel 1: Compiler – Abhängigkeiten und Anforderungen Kapitel 2: Interner Aufbau von Compilern Compilerphasen Strukturen Optimierender Compiler Zielfunktionen von Code-Optimierungen Kapitel 3: Lexikalische Analyse (Scanner) Kapitel 4: Syntaktische Analyse (Parser) Kapitel 5: Semantische Analyse Kapitel 6: Instruktionsauswahl Kapitel 7: Register-Allokation Kapitel 8: Code-Optimierung Kapitel 9: Ausblick Folie 19 / 30

Zielfunktion: (Typische) Laufzeit Durchschnittliche Laufzeit, Average-Case Execution Time (ACET) Ein ACET-optimiertes Programm soll bei einer „typischen” Aus- führung (d.h. mit „typischen” Eingabedaten) schneller ablaufen. Die Zielfunktion optimierender Compiler schlechthin. Strategie: „Greedy”, d.h. wo die Ausführung von Code zur Laufzeit eingespart werden kann, wird dies i.d.R. auch getan. ACET-optimierende Compiler haben meist kein präzises Modell der ACET. Exakte Auswirkung von Optimierungen auf die effektive Laufzeit ist dem Compiler unbekannt. ACET-Optimierungen sind meist vorteilhaft, manchmal aber auch bloß neutral oder sogar nachteilig. Folie 20 / 30

Beispiel: Function Inlining main() { ... a = min( b, c ); ...min( f, g )... } main() { ... a = b<c ? b : c; ...f<g ? f : g; } int min( int i, int j ) { return( i<j ? i : j ); } Potenzielle Laufzeit-Reduktion wegen: Wegfallenden Codes für Parameter- / Rückgabewert-Übergabe Wegfallenden Codes zum Sprung in die aufgerufene Funktion Evtl. wegfallender Speicherplatz-Allokation zu Beginn der aufgerufenen Funktion Evtl. Ermöglichung anderer Optimierungen, die sonst an Funktionsgrenzen scheitern Folie 21 / 30

Zielfunktion: Codegröße Erzeugung von minimal wenig Code, in Bytes gemessen Einfache Modellbildung: Compiler weiß, welche Instruktionen er generiert, und wie viele Bytes jede einzelne Instruktion benötigt. Oft Zielkonflikt mit Laufzeit-Minimierung: Bsp. Inlining Kopieren des Funktionsrumpfes an Stelle des Funktionsaufrufs Bei großen Funktionen und/oder vielen Vorkommen von Aufrufen im Code: starke Erhöhung der Codegröße! Codegrößen-minimierende optimierende Compiler: Komplett deaktiviertes Function Inlining Folie 22 / 30

Zielfunktion: Energieverbrauch (1) Generierung von Code mit minimalem Energieverbrauch Modellbildung umfasst i.d.R. Prozessor und Speicher Einfaches Energiemodell für Prozessoren: Basiskosten eines Befehls: Energieverbrauch des Prozessors bei Ausführung nur dieses einen Befehls Ermittlung der Basiskosten (z.B. für ADD-Befehl): Schleife, die zu untersuchenden Befehl sehr oft enthält. Ausführung auf realer Hardware Energiemessung: Amperemeter Ergebnis herunterrechnen auf einmal ADD Wiederholen für kompletten Befehlssatz .L0: ... ADD d0, d1, d2; JMP .L0; Folie 23 / 30

Zielfunktion: Energieverbrauch (2) Einfaches Energiemodell für Prozessoren: Inter-Instruktionskosten zwischen zwei nachfolgenden Befehlen: Modellieren Aktivierung und Deaktivierung Funktionaler Einheiten (FUs) Beispiel: ADD wird in ALU ausgeführt, MUL in Multiplizierer .L0: ADD d0, d1, d2; MUL d3, d4, d5; ... JMP .L0; Schleife, die zu untersuchendes Befehls-paar sehr oft enthält. Ausführung & Messung wie bei Basiskosten Ergebnis herunterrechnen auf ein Befehls-paar ADD und MUL Wiederholen für alle Kombinationen von FUs Folie 24 / 30

Zielfunktion: Energieverbrauch (3) Funktionale Einheiten von ARM7-CPUs: Funktionale Einheiten: Address Incrementer, 32x8 Multiplier, Barrel Shifter und ALU Beispiel von voriger Folie: ALU für ADD mit Energie versorgen, Addition durchführen. Danach: Multiplier für MUL anschalten, die Busse von/zum Multiplier aufladen. Schließlich: Nach MUL Multiplier abschalten, die Busse entladen. An-/Abschalten & Auf-/Entladen kostet viel Energie! Folie 25 / 30

Zielfunktion: Energieverbrauch (4) Berechnung der Prozessor-Energie durch Compiler: Summiere Basiskosten aller generierten Instruktionen Summiere Inter-Instruktionskosten benachbarter Befehlspaare [V. Tiwari et al., Power Analysis of Embedded Software: A First Step Towards Software Power Minimization, IEEE Transactions on VLSI, Dezember 1994] Berechnung der Speicher-Energie durch Compiler: Entweder anhand von Datenblättern oder durch Messungen Grundlage: Energieverbrauch pro Lade- und Speichervorgang Einfach für Statische RAMs (SRAM), schwer für Caches und Dynamische RAMs (DRAM) [S. Steinke et al., An Accurate and Fine Grain Instruction-Level Energy Model Supporting Software Optimizations, PATMOS Workshop, September 2001] Folie 26 / 30

Zielfunktion: Worst-Case Laufzeit (1) Worst-Case Execution Time (WCET): Die maximale Laufzeit eines Programms über alle denkbaren Eingabedaten hinweg. Problem: Ermittlung der WCET eines Programms nicht berechenbar! (Würde Lösen des Halte-Problems beinhalten) Folie 27 / 30

Zielfunktion: Worst-Case Laufzeit (2) Lösung: Schätzung oberer Grenzen für die echte (unbekannte) WCET Anforderungen an WCET-Abschätzungen: Sicherheit (safeness): WCET  WCETEST! Präzision (tightness): WCETEST – WCET  minimal Folie 28 / 30

Literatur Steven S. Muchnick, Advanced Compiler Design & Implementation, Morgan Kaufmann, 1997. ISBN 1-55860-320-4 Andrew W. Appel, Modern compiler implementation in C, Cambridge University Press, 1998. ISBN 0-521-58390-X Folie 29 / 30

Zusammenfassung Bedeutung einzelner Phasen eines Compilers Anordnung von Optimierungen innerhalb des Compilers Zielfunktionen: ACET, Codegröße, Energieverbrauch, WCET Folie 30 / 30