24
Struktur und Implementierung von Programmiersprachen II 17. Oktober 2006 1/1 Struktur und Implementierung von Programmiersprachen II (Compilerbau) WS 2006/2007 Vorlesung und Übung: Dr. Christoph Herrmann http://infosun.fmi.uni-passau.de    /cl/lehre/sips2-ws0607/index.html

Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Embed Size (px)

Citation preview

Page 1: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/1

Struktur und Implementierung von Programmiersprachen II

(Compilerbau)

WS 2006/2007

Vorlesung und Übung: Dr. Christoph Herrmann

http://infosun.fmi.uni­passau.de   /cl/lehre/sips2­ws0607/index.html

Page 2: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/2

Einordnung im Studienplan

Umfang: 2V+2Ü

anrechenbar:

(a) Bachelor (5 ECTS­Punkte)

(b) Diplom 

Säule INebenfach InformatikVertiefungsgebiet: Methoden des Programmentwurfs

Page 3: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/3

Inhalt der Übung

wöchentlicher Übungstermin: flexible Zweiteilung mit Pause

 1. Teil: Vorbereitung auf die Klausur 

Diskussion des VorlesungsstoffsBesprechung von Übungsaufgaben auf Papier

2. Teil: Programmierpraxis (kein offizielles Praktikum!) 

Programmierung eines Mini­Compilers in Javaempfohlen: Arbeit in Teams zu drei Personen bei Teilnahme bis zum Schluss: BescheinigungEigeninitiative nötig

Page 4: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/4

SIPS I (SS 2006, 2SWS): Spracherkennung: Scanner/Parser, semantische Analyse; Interpretation, triviale Codegenerierung

 SIPS II (WS 2006/2007, 2SWS)Implementierung imperativer Konstrukte, Context­Handling,  Codegenerierung, Codeoptimierung, Laufzeitsystem

 SIPS III (voraussichtlich SS 2007, 2SWS)Implementierung funktionaler, logischer, Objekt­orientierter und paralleler Features

SIPS ­ Vorlesungszyklus

Page 5: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/5

Literatur

Vorlesung:

Grune, Bal, Jacobs, Langendoen:

Modern Compiler Design

Wiley, 2002

Übung:

Andrew Appel (mit Jens Palsberg):

Modern Compiler Implementation 

in Java (second edition)

Cambridge University Press, 2002

Page 6: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/6

Compilerbau: Sammlung von Technologien (1)

Programme als mächtige Ein­/Ausgabeelemente 

   Model­driven Architectures, Tcl/Tk, Bytecode, HTML, XML, Latex, Postscript, PDF, JPEG, MPEG, SQL, VHDL, Spezifikationssprachen, Domänen­spezifische Sprachen (Bildverarbeitung, Simulation)

Page 7: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/7

Compilerbau: Sammlung von Technologien (2)

Programme als mächtige Ein­/Ausgabeelemente

Anwendungsgebiet für Algorithmen und Datenstrukturen

Automatentheorie, Sprachen/Grammatiken, Programmanalyse, Symbolverwaltung, semantische Repräsentation, Ressourcenmanagement und ­Optimierung  (Graphalgorithmen, P/NP­Probleme)

Funktionale Programmierung: Typsysteme, Termersetzung, Funktionen höherer Ordnung

Logikprogrammierung: Unifikation, Backtracking, deduktive Datenbanken

Parallelität/Nebenläufigkeit: Grid­Computing, Bytecode, Scheduling, Allokation, Marshaling  

Page 8: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/8

Compilerbau: Sammlung von Technologien (3)

Programme als mächtige Ein­/Ausgabeelemente

Anwendungsgebiet für Algorithmen und Datenstrukturen

Programmgeneratoren für hohe Performanz

reguläre Ausdrücke/Grammatik → Scanner/ParserErsetzungsregeln → OptimiererMaschinenspezifikation → Codegenerator

domänenspezifisch:

SQL­Spezifikation → DatenbankoperationenSystemmodell → SimulatorDSP­Spezifikation → Signalprozessor

Page 9: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/9

Compiler ↔ Interpreter (1)

Page 10: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/10

Übergänge Compiler/Interpreter sind fließend

man kann Interpreter in einen Compiler transformieren

Verwendung eines Compilers allein garantiert noch keine effiziente Ausführung, es gibt viele Effizienzaspekte!

allgemein: semantische Transformationen, Verringerung der Anzahl von Operationen, Optimierung des Programmflusses, Speicherverwaltung, Inlining, Schleifentransformationen

maschinenabhängig: Registervergabe, Cache­Optimierung, partielles Loop­Unrolling, Pipelining, Sprungoptimierung, Befehlsauswahl

Compiler ↔ Interpreter (2)

Page 11: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/11

Frontend: Analyse des Quellprogramms

Backend: Generierung des Zielprogramms 

Grobaufbau eines Compilers

Page 12: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/12

Trennung von Frontend und Backend

Idee: L+M Module statt L*M Compiler

Page 13: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/13

Feinaufbau eines komplexen Compilers

Page 14: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/14

 Scanner (endliche Automaten) 

Erkennung von Namen, Schlüsselwörtern, Operatoren

 Parsing (deterministische Kellerautomaten)

Strukturanalyse, Erzeugung eines Parsebaums / Syntaxbaums

(a) Top­Down (vorgegebener Parser in SIPS II ­ Übung)

(b) Bottom­Up 

 Attributierung (Kontextsensitivität)

Typprüfung in der SIPS II ­ Vorlesung/Übung ist Spezialfall davon 

 Datenflussanalyse

kommt in einfacher Form in SIPS II ­ Übung

 Interpreter + partielle Auswertung = triviale Codegenerierung

Rückblick auf SIPS I, Einflüsse auf SIPS II

Page 15: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/15

 Context­Handling (Symboltabelle, Gültigkeitsbereiche, Typprüfung)

 Repräsentation von Daten, Objekten, Routinen

 Kontrollflussorganisation (Bedingungen, Schleifen)

 verschiedene Arten der Codegenerierung

 Code­Optimierung

 Assembler, Linker, Loader

 Laufzeitsystem und Speicherverwaltung

Inhalte der SIPS II ­ Vorlesung

Page 16: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/16

expression   expression ´+´ term→           | expression ´­´ term           | term

term         term ´*´ factor→           | term ´/´ factor           | factor

factor       identifier→           | constant           | ´(´ expression ´)´

...

Quellsprache: arithmetische Ausdrücke mit Klammerung

● Nichtterminale: { expression, term, factor, identifier, constant }

● Terminale: { +, -, *, /, (, ) }

● Startsymbol: expression

● Produktionen:

Beispielausdruck: b*b­4*a*c

Beispiel zur Syntax

Page 17: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/17

 Parsebaum reflektiert die Grammatik innere Knoten sind Nichtterminale kann Klammern enthalten 

Syntaxanalyse (Parsing)

Page 18: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/18

Top­Down Baumerzeugung (LL(k) mit Eingabe­Lookahead k)

Vorhersage der richtigen Produktion nötig (k evtl. groß) 

Nachteil: keine linksrekursive Produktion möglich, Optionen:

(a) Grammatik umschreiben, Parsebaum rücktransformieren(b) auf syntaktischen Komfort verzichten, Bsp.: x=(a*b)+cVorteil: Steuerung des Parsens durch Kontextinformation

Bottom­Up Baumerzeugung (LR(k))

Erkennung und Reduktion rechter Seiten von Produktionen

Vorteil: Linksrekursion (und auch Rechtsrekursion) möglich

große Mächtigkeit: k:LL(k)LR(k), aber k:LR(0)⊆LL(k)

Strategien der Syntaxanalyse

Page 19: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/19

 Ausgangspunkt für die SIPS II ­Vorlesung und ­Übung ableitbar aus dem Parsebaum, meist aber direkt erzeugt Ausdrücke als Funktionen auf Termen Aufbau/Priorität durch Baumdarstellung gegeben 

(keine Klammern, keine Nichtterminale) innere Knoten sind Operatoren/Funktionssymbole

Abstrakter Syntaxbaum (AST)

Page 20: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/20

abstrakter Syntaxbaum plussemantische Information (hier: Typen)Implementierungsinformation (hier: Speicherstelle)

Annotierter AST

Page 21: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/21

AST als Ausgangspunkt für Interpreter und Compiler

Page 22: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/22

Repräsentation eines AST als verzeigerte Struktur

Page 23: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/23

 Einfache Codeerzeugung aus einem AST (für Stackmaschine) 

Page 24: Struktur und Implementierung von Programmiersprachen II ... · 17. Oktober 2006 Struktur und Implementierung von Programmiersprachen II 1/3 Inhalt der Übung wöchentlicher Übungstermin:

Struktur und Implementierung von Programmiersprachen II17. Oktober 2006 1/24

 die Wahl des Zwischencodes ist variabel, Möglichkeiten:

(a) AST: annotierter abstrakter Syntax­Baum oder ­Graph

(b) lineare Darstellungen wie Dreiadresscode

Bsp.: x=a*b; y=x+1(c) Befehle für eine abstrakte Stackmaschine 

Bsp.: push a; push b; mult; push 1; add; pop y  Festlegung auf eine bestimmte Form

notwendig für Aussagen über eine konkrete Implementierung

nicht sinnvoll für eine Übersichtsvorlesung

 

 Alternativen für den Zwischencode