Informatik II SS Der Kompilationsprozess (-phasen) Schreiben des Programms. Die Organisation eines typischen Compilers

Ähnliche Dokumente
Beispiel einer Übersetzung

Compiler und Codegenerierung. Hw-Sw-Co-Design

Static-Single-Assignment-Form

Was ist ein Compiler?

Lösungsvorschlag zu 1. Übung

9 Theoretische Informatik und Compilerbau

1 ÜBERSETZER. Compilerbau 1

Interpreter - Gliederung

Assembler - Einleitung

Rechnerarchitektur Teil 2

Praktikum Compilerbau

Lehrstuhl Informatik VI Grundzüge der Informatik * WS 2008/2009 Prof. Dr. Joachim Biskup

Phasen der Codegenerierung

Betriebssysteme Teil 4: Übersetzung von C-Programmen

Fachseminar. Semantische Analyse

Zwischencodeerzeugung Compiler II

Werkzeuge zur Programmentwicklung

Compilerbau mit Phoenix

Programmierung 2. Übersetzer: Das Frontend. Sebastian Hack. Klaas Boesche. Sommersemester

Institut für Informatik Prof. Dr. D. Hogrefe Dipl.-Inf. R. Soltwisch, Dipl.-Inform. M. Ebner, Prof. Dr. D. Hogrefe Informatik II - SS 04.

Einführung Compilerbau

Kapitel 17 Code-Erzeuger und Laufzeitübersetzer

Programmierkurs: Delphi: Einstieg

Grundlagen der Informatik I (Studiengang Medieninformatik)

Atomic Basic Blocks Eine kontrollflussunabhängige Zwischendarstellung für Echtzeitsysteme

Übersicht. Übersetzungsprozess gcc(i) als Steuerprogramm Assembler Binder Hauptprogramme in C

Einführung in die Informatik I (autip)

Software Engineering. Statische Analyse! Kapitel 11

C-Grundlagen. Einführung von Tronje Krabbe 1/21

Syntax von LOOP-Programmen

Stephan Brumme, SST, 2.FS, Matrikelnr

I.1 Die Parrot Assemblersprache

Compiler. Die unsichtbaren Diener Der Compiler und seine Artgenossen. Laszlo Böszörmenyi Compiler 1/ 22

Kapitel 4. Einführung in den Scannergenerator Flex. Einführung in den Scannergenerator Flex Wintersemester 2008/09 1 / 9

Vorlesung Rechnerarchitektur. Einführung

Ausgewählte Kapitel eingebetteter Systeme

J.5 Die Java Virtual Machine

Modellierung und Programmierung 1

kontextfreie Grammatiken Theoretische Informatik kontextfreie Grammatiken kontextfreie Grammatiken Rainer Schrader 14. Juli 2009 Gliederung

1.7 Assembler Programmierung

3AA. Prof. Dr. Wolfgang P. Kowalk. Universität Oldenburg WS 2005/2006

2. Computer (Hardware) K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16

Programmiersprachen und Übersetzer

Einführung in die Systemprogrammierung

Hauptseminar Automotive Software Engineering Testen, Rapid Prototyping und x in the loop

Kapitel 4: Syntaxdiagramme und Grammatikregeln

Echtzeit-Multitasking

2.11 Kontextfreie Grammatiken und Parsebäume

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

6 Kontextfreie Grammatiken

Grundlagen der Informatik II. Teil I: Formale Modelle der Informatik

Einführung in die Informatik Grammars & Parsers

1.2 LOOP-, WHILE- und GOTO-Berechenbarkeit

den Einsatz von generierenden Werkzeugen und Theorien und von Software-Engineering-Methoden

Abstrakte Algorithmen und Sprachkonzepte

Grundlagen der Programmentwicklung

Technische Informatik 1 - HS 2016

Einführung in die Systemprogrammierung

Einführung in die Informatik 1

Einführung in Generatives Programmieren. Bastian Molkenthin

Übersetzergenerierung mit lex und yacc

Compiler, Übersetzer. Allgemeine Erklärung / Definition

Schachtelung der 2. Variante (Bedingungs-Kaskade): if (B1) A1 else if (B2) A2 else if (B3) A3 else if (B4) A4 else A

2. Algorithmen und Algorithmisierung Algorithmen und Algorithmisierung von Aufgaben

Assembler und Hochsprachen

Welche Informatik-Kenntnisse bringen Sie mit?

Universität Karlsruhe (TH)

Schleifenprogrammierung in C/C++, Fortran und Pascal

Komplexität von Algorithmen

Fachseminar WS 2008/09

Rückblick Speicherverwaltung

Informatik I Übung, Woche 40

2D22 Prinzipien der Softwareentwicklung. Prinzipien der Softwareentwicklung S. Strahringer 1

C.3 Funktionen und Prozeduren

4.Grundsätzliche Programmentwicklungsmethoden

Theoretische Informatik. Grammatiken. Grammatiken. Grammatiken. Rainer Schrader. 9. Juli 2009

Assembler-Programme. Systemprogrammierung (37-023) Elementare Komponenten eines Assembler-Programmes

Geben Sie dazu jedes Mal, wenn sie die Zeile 15 passieren, die aktuelle Feldbelegung an. Der Anfang wurde bereits gemacht.

Mächtigkeit von WHILE-Programmen

Programmierung WS12/13 Lösung - Übung 1 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Hardware/Software-Codesign

Betriebssysteme I: Speicherverwaltung (Teil A: Adress-Bindung)

Der Toy Rechner Ein einfacher Mikrorechner

Heute nur MIPS-Praxis (4 Aufgaben)

Die Programmiersprache C Eine Einführung

Ausarbeitung des Interpreter Referats

Seminar Werkzeuggestütze. tze Softwareprüfung. fung. Slicing. Sebastian Meyer

Allgemeine Hinweise: TECHNISCHE UNIVERSITÄT MÜNCHEN. Name Vorname Studiengang Matrikelnummer. Hörsaal Reihe Sitzplatz Unterschrift

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

Random Access Machine (RAM) Berechenbarkeit und Komplexität Random Access Machines

Programmierkurs II. C und Assembler

Workshop: ASURO-Programmieren in C

Grundlagen der Informatik III Wintersemester 2010/ Vorlesung Dr.-Ing. Wolfgang Heenes

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

(Prüfungs-)Aufgaben zur Berechenbarkeits- und Komplexitätstheorie

Technische Informatik 1 - HS 2015

Inhaltsverzeichnis. Einführende Bemerkungen 11. Das Fach Informatik 11 Zielsetzung der Vorlesung Grundbegriffe

Übung 1 - Betriebssysteme I

Grammatiken und ANTLR

Assembler-Programmierung

Transkript:

Der Kompilationsprozess (-phasen) Informatik II SS 2004 Teil 6: Sprachen, Compiler und Theorie 7 Prof. Dr. Dieter Hogrefe Dipl.-Inform. Michael Ebner Lehrstuhl für Telematik Institut für Informatik Scanner (lexikalische Analyse) Parser (syntaktische Analyse) Semantische Analyse Zwischencodegenerierung Optimierung Zielcodegenerierung Optimierung Maschinenebene Lese Programm und konvertiere Zeichenstrom in Marken (tokens). Theorie: Reguläre Ausdrücke, endlicher Automat Lese Tokenstrom und generiere Ableitungsbaum (parse tree). Theorie: Kontextfreie Grammatiken, Kellerautomat Traversiere Parserbaum, überprüfe nicht-syntaktische Regeln. Traversiere Parserbaum noch mal, gebe Zwischencode aus. Untersuche Zwischencode, versuche ihn zu verbessern. Übersetze Zwischencode in Assembler-/Maschinencode Untersuche Maschinencode, versuche ihn zu verbessern. 6.7-2 Die Organisation eines typischen Compilers Schreiben des Programms Frontend Führt Operationen aus welche von der zu kompilierenden Sprache abhängen und nicht von der Zielmaschine Backend Führt Operationen aus welche etwas Wissen über die Zielmaschine haben müssen Ein kleines Programm, geschrieben in Pascal, welches den größten gemeinsamen Teiler (ggt) von zwei Ganzzahlen berechnet 6.7-3 6.7-4

Vom Text des Quellcodes zu den Tokens Von den Tokens zum Ableitungsbaum Programmquelltext Tokens Programmquelltext Ableitungsbaum und Symboltabelle program gcd ( input, output ) ; var i, j : integer ; read ( i, j ) ; while i <> j do if i 6.7-5 6.7-6 Zwischencode Nicht optimierende Compiler Der Ableitungsbaum einem Kontrollflussgraphen konvertiert Die Knoten des Kontrollflussgraphen sind grundlegende Blöcke und enthalten eine pseudo- Assemblersprache Die Kontrolle kann einen grundlegenden Block nur vom Anfang betreten und kann in nur am Ende wieder verlassen Der Kontrollflussgraph wird zum Zielcode der Zielmaschine konvertiert Der Zielcode ist eine andere pseudo-assemblersprache Der Kontrollfluss wird ausführlich gemacht durch: Bezeichnen der Anfänge der grundlegenden Blöcke Konvertieren der Kontrollflusskanten zu Sprung- (branch), Aufruf- (call) und Rückkehrinstruktionen Virtuelle Register werden durch reale Register ersetzt 6.7-7 6.7-8

Zielcode Vom Zielcode zum Assemblercode Der Zielcode ist beinahe Assemblercode Der Kontrollfluss ist ausführlich Der Code referenziert nur reale Registernamen Anweisungen zum Speicherreservieren sind vorhanden Zielcode ist einfach zu Assemblercode zu übersetzen Normalerweise einfach: r10 := r8 + r9 -> add $10, $8, $9 r10 := r8 + 0x12 -> addi $10, $8, 0x12 Manchmal auch zu einer Folge von Instruktionen erweitert: r14 := 0x12345abc -> lui $14, 0x1234 ori $14, 0x5abc 6.7-9 6.7-10 Binden (linking) Optimierende Compiler Beim Binden werden mehrere durch den Assembler erzeugte Objektdateien zu einer einzelnen, ausführbaren Datei kombiniert, welche durch ein Betriebssystem lauffähig ist Optimierung ist ein komplexer Prozess Verbessert die Qualität des generierten Codes auf Kosten von zusätzlicher Compilezeit Optimierer sind schwierig zu schreiben und einige Optimierungen verbessern das fertige Programm vielleicht nicht Praxistip: Die jeweilige Einstellung der Optimierungstiefe eines Compilers genau auf korrekte Funktion kontrollieren, da diese öfters fehleranfällig sind (lieber erstmal auf Optimierung verzichten und erst am Ende austesten!) 6.7-11 6.7-12

Peephole-Optimierung Peephole-Optimierungstypen (1/3) Sehe dir den Zielcode an, wenige Instruktionen gleichzeitig, und versuche einfache Verbesserungen zu machen Versucht kurze, sub-optimale Folgen von Instruktionen zu finden und ersetzt diese Sequenzen mit einer besseren Sequenz Sub-Optimale Sequenzen werden durch Muster (patterns) spezifiziert Meistens heuristische Methoden Es gibt keinen Weg um zu überprüfen ob das Ersetzen eines sub-optimalen Musters tatsächlich das endgültige Programm verbessern wird Einfach und ziemlich wirksam Redundante load/store Instruktionen beseitigen r2 := r1 + 5 i := r2 r3 := i r4 := r3 x 3 Konstantenfaltung (constant folding) r2 := 3 x 2 r2 := r1 + 5 i := r2 r4 := r2 x 3 r2 := 6 Entfernung gemeinsamer Teilausdrücke (common subexpression elimination) r2 := r1 x r5 r2 := r2 + r3 r3 := r1 x r5 r4 := r1 x r5 r2 := r4 + r3 r3 := r4 6.7-13 6.7-14 Peephole-Optimierungstypen (2/3) Peephole-Optimierungstypen (3/3) Fortpflanzung von Konstanten (constant propagation) Algebraische Vereinfachung (strength reduction) r2 := und auch r3 := r1 + 4 r2 := und r3 := r1 + 4 r2 := r1 := r2 x 2 r1 := r2 / 2 r1 := r2 + r2 r1 := r2 >> 1 oder r1 := r2 << 1 r3 := *r3 r3 := r1 + 4 r3 := *r3 und r3 := *(r1+4) Beseitigung von unnötigen Instruktionen Fortpflanzung von Zuweisungen (copy propagation) r2 := r1 r2 := r1 r3 := r1 + r1 und r3 := r1 + r1 6.7-15 r1 := r1 + 0 r1 := r1-0 r1 := r1 * 1 (wird komplett beseitigt) 6.7-16

Komplexe Optimierungen Beispiel für komplexe Optimierung Es ist für den Optimierer erforderlich den Datenfluss zwischen Registern und Speicher zu verstehen Wird durch Datenflussanalyse (data flow analysis) bestimmt Beispiel: Finde die Variablenmenge welche einen grundlegenden Block auf dem Weg zu einem anderen Block durchfliesst und von diesem anderen Block verwendet wird (lebendige Variablen) Ist wichtig für Optimierungen welche datenverändernde Instruktionen einfügen, löschen oder bewegen Der ursprüngliche Programmdatenfluss kann nicht geändert werden! Schleifeninvarianter Code (Loop Invariant Code Motion) Bewege Berechnungen, dessen Werte während allen Schleifeniterationen gleich bleiben (invariant sind), aus der Schleife raus L1: r1 := *(sp + 100) r2 := *r1 r3 := r2 < 100 if r3 goto L1 L0: r1 := *(sp + 100) Es ist für den Optimierer erforderlich die Struktur des Kontrollflussgraphen (control flow graph) zu verstehen Wird durch Kontrollflussanalyse bestimmt Ist wichtig für die Leistungsoptimierung von Schleifen oder schleifenähnlichen Strukturen in dem Kontrollflussgraphen L1: r2 := *r1 r3 := r2 < 100 if r3 goto L1 6.7-17 6.7-18 Was haben Sie in diesem Kapitel gelernt? Programmiersprachen sind Abstraktionsmechanismen, welche: ein Rahmenwerk zum Lösen von Problemen und erzeugen neuer Abstraktionen bieten Schirmen den Programmierer von niederen Detailebenen (low-level details) der Zielmaschine (Assemblersprache, Verbinden (linken), etc.) ab Compiler sind komplexe Programme welche eine höhere Programmiersprache in eine Assemblersprache umwandeln um danach ausgeführt zu werden Compilerprogrammierer handhaben die Komplexität des Kompilationsprozesses durch: aufteilen des Compilers in unterschiedliche Phasen verwenden, ausgehend von der Spezifikation, eine Theorie für den Bau von Compilerkomponenten Ausblick Compilerbau (Kapitel 6) Betriebssysteme (Kapitel 5) Maschinenorientierte Programmierung (Kapitel 4) von-neumann-rechner (Kapitel 3) Speicher Zahlen und logische Schaltungen (Kapitel 2) von-neumann-rechner Kommunikation (Kapitel 7) 6.7-19 6.7-20