Compilerbau + Virtuelle Maschinen

Ähnliche Dokumente
DieÜbersetzung funktionaler Programmiersprachen

Programmiersprachen und Übersetzer

8 DieTürmevonHanoi. Problem:

Technische Universität München WS 2004/2005 Fakultät für Informatik 11. Dezember 2004 Prof. Dr. Seidl

Vorlesung Rechnerarchitektur. Einführung

Einführung. (Compiler) Prof. Dr. Oliver Braun. Letzte Änderung: :49. Einführung 1/26

Übungs- und Praktikumsaufgaben zur Systemprogrammierung Dipl.-Ing. H. Büchter (Lehrbeauftragter) FH-Dortmund WS 2001/2002 / SS 2002

Compiler. Einführung. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München. Letzte Änderung:

Compiler: Einführung

Konzepte der Programmiersprachen

Rechnerstrukturen 1: Der Sehr Einfache Computer

Einführung IMP-Syntax Reduktionssemantik Maschinen-Semantik. Teil IV. Semantik imperativer Sprachen

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester

Just-In-Time-Compiler (2)

Just-In-Time-Compiler (2)

1 Einleitung. 1.1 Höhere Programmiersprachen

Betriebssysteme Vorstellung

1 Rechnerstrukturen 1: Der Sehr Einfache Computer

Prinzipieller Aufbau und Funktionsweise eines Prozessors

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

2.1 Rechnersichten 2.2 Rechnerorganisation: Aufbau und Funktionsweise

Effiziente Virtuelle Maschinen für funktionale Programmiersprachen

Datenpfad einer einfachen MIPS CPU

Systeme I: Betriebssysteme Kapitel 8 Speicherverwaltung

Vorlesung Programmieren

Betriebssysteme Teil 3: Laufzeitsystem für Programme

Beobachtung 1: Beispiel: Intuitive Programme sind oft ineffizient.

Vorlesung Programmierung

Technische Informatik 1 - HS 2017

... die Funktion Ñ Ò µ einer Klasse ÂÚÑ:

Grundlagen der Rechnerarchitektur

Vorlesung Programmierung

Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 15 (Linearer Speicher, Listen, Bäume)

Was ist ein Profiler?

1. Grundkonzepte der logischen Programmierung 2. Syntax von Prolog 3. Rechnen in Prolog. IV.1 Grundkonzepte der logischen Programmierung - 1 -

Vorlesung Programmierung

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

Werkzeuge zur Programmentwicklung

Rechner- organisa-on 2 TOY. Karl C. Posch.

Definition Compiler. Bekannte Compiler

Stack, Stackpointer, Unterprogramm HP: 0 * 1 * 2 * 3 CAL UP1 4 * 5 * 6 CAL UP2 7 *... UP1: 30 * 33 RET UP2: 40 * 41 CAL UP1 42 * 43 RET

Grundbegriffe der Informatik

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Informatik 12 Kapitel 3 - Funktionsweise eines Rechners

Outline. 1 Einleitung. 2 Einführung in C. 3 Fortgeschrittenes in C. 4 Einführung in Emacs Lisp. 5 Einführung in Prolog. 6 Formale Semantik

Vorkurs Informatik WiSe 16/17

Programmieren. Aufgabe 1 (Eine erste Datenstruktur)

Betriebssysteme. Vorlesung im Herbstsemester 2010 Universität Mannheim. Kapitel 6: Speicherbasierte Prozessinteraktion

Vorlesung Datenstrukturen

Praktische Informatik 1

Übersicht Formale Semantik. Übersicht Axiomatische Semantik. Inhaltsübersicht HPS WS 2003/04. Vorlesung Höhere Programmiersprachen,

Einführung in die Programmierung mit Java

3. Sprachkonzepte und ihre Übersetzungen

Einführung in die Programmierung mit VBA

Musterlösungen Technische Informatik 2 (T2) Prof. Dr.-Ing. D. P. F. Möller

12 Abstrakte Klassen, finale Klassen und Interfaces

Rechnerorganisation 2 TOY. Karl C. Posch. co1.ro_2003. Karl.Posch@iaik.tugraz.at

n 1. Der Begriff Informatik n 2. Syntax und Semantik von Programmiersprachen - 1 -

Struktur der CPU (1) Die Adress- und Datenpfad der CPU: Befehl holen. Vorlesung Rechnerarchitektur und Rechnertechnik SS Memory Adress Register

Der Toy Rechner Ein einfacher Mikrorechner

Zwischencode-Erzeugung. 2. Juni 2009

Computeranwendung in der Chemie Informatik für Chemiker(innen) 3. Software

1 Abstrakte Datentypen

Vorlesung Programmieren

Übungsblatt 10 (Block C 2) (16 Punkte)

Liste Programmieren Java Überblick

Algorithmen und Datenstrukturen

Grundlagen: Algorithmen und Datenstrukturen

Assembler Integer-Arithmetik

Vorkurs Informatik WiSe 17/18

Static-Single-Assignment-Form

4. Übung SPS-Programmierung


PostScript -Sprache. Frank Richter

Programmiertechnik. Prof. Dr. Oliver Haase Raum G124 Tel: 07531/ Oliver Haase Hochschule Konstanz 1

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

1 Klassen und Objekte

Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015

Wintersemester 2006/2007 Helmut Seidl Institut für Informatik TU München

Abstrakte C-Maschine und Stack

Zwischencodeerzeugung Compiler II

Programmierkurs Python I

Einführung in die objektorientierte Programmierung. mit Squeak

Datenpfad einer einfachen MIPS CPU

Assembler-Programmierung

Algorithmen und Datenstrukturen 1 Kapitel 4.1

Datenpfad einer einfachen MIPS CPU

EIDI 1 Einführung in die Informatik 1. PGdP Praktikum Grundlagen der Programmierung. Harald Räcke 2/217

1 Funktionale vs. Imperative Programmierung

Die Programmiersprache C Eine Einführung

J.5 Die Java Virtual Machine

Instruktionssatz-Architektur

Abschnitt 11: Korrektheit von imperativen Programmen

2 Eine einfache Programmiersprache

Echtzeit-Multitasking

Echtzeit-Multitasking

Transkript:

Helmut Seidl Compilerbau + Virtuelle Maschinen München Sommersemester 2009 1

Organisatorisches Der erste Abschnitt Die Übersetzung von C ist den Vorlesungen Compilerbau und Virtuelle Maschinen gemeinsam :-) Er findet darum zu den Compilerbauterminen statt :-) Zeiten: Vorlesung Compilerbau: Mo. 14:00-15:30 Uhr Mi. 10:15-11:45 Uhr Vorlesung Virtuelle Maschinen: Di. 10:15-11:45 Uhr Übung Compilerbau: Do. 12-14 Übung Virtuelle Maschinen: Do. 10-12 2

Einordnung: Diplom-Studierende: Compilerbau: Virtuelle Maschinen: Bachelor-Studierende: Compilerbau: Virtuelle Maschinen: Wahlpflichtveranstaltung Vertiefende Vorlesung 8 ETCS-Punkte nicht anrechenbar 3

Scheinerwerb: Diplom-Studierende: 50% der Punkte; zweimal Vorrechnen :-) Bachelor/Master-Studierende: Klausur / Mündliche Prüfung Erfolgreiches Lösen der Aufgaben wird als Bonus von 0.3 angerechnet. 4

Material: Aufzeichnung der Vorlesungen (Folien + Annotationen + Ton + Bild) die Folien selbst :-) Tools zur Visualisierung der Virtuellen Maschinen :-)) Tools, um Komponenten eines Compilers zu generieren... 5

0 Einführung Prinzip eines Interpreters: Programm + Eingabe Interpreter Ausgabe Vorteil: Keine Vorberechnung auf dem Programmtext erforderlich keine/geringe Startup-Zeit :-) == Nachteil: Während der Ausführung werden die Programm-Bestandteile immer wieder analysiert == längere Laufzeit :-( 6

Prinzip eines Übersetzers: Programm Übersetzer Code Eingabe Code Ausgabe Zwei Phasen: Übersetzung des Programm-Texts in ein Maschinen-Programm; Ausführung des Maschinen-Programms auf der Eingabe. 7

Eine Vorberechnung auf dem Programm gestattet u.a. eine geschickte(re) Verwaltung der Variablen; Erkennung und Umsetzung globaler Optimierungsmöglichkeiten. Nachteil: Die Übersetzung selbst dauert einige Zeit :-( Vorteil: Die Ausführung des Programme wird effizienter == lohnt sich bei aufwendigen Programmen und solchen, die mehrmals laufen... 8

Aufbau eines Übersetzers: Programmtext Frontend Interndarstellung (Syntaxbaum) Optimierungen Interndarstellung Code erzeugung Programmtext für die Zielmaschine 9

Aufgaben der Code-Erzeugung: Ziel ist eine geschickte Ausnutzung der Möglichkeiten der Hardware. Das heißt u.a.: 1. Instruction Selection: Auswahl geeigneter Instruktionen; 2. Registerverteilung: optimale Nutzung der vorhandenen (evt. spezialisierten) Register; 3. Instruction Scheduling: Anordnung von Instruktionen (etwa zum Füllen einer Pipeline). Weitere gegebenenfalls auszunutzende spezielle Hardware-Features können mehrfache Recheneinheiten sein, verschiedene Caches,... Weil konkrete Hardware so vielgestaltig ist, wird die Code-Erzeugung oft erneut in zwei Phasen geteilt: 10

Zwischen darstellung Code erzeugung virtueller Maschinencode virtueller Maschinencode Übersetzer konkreter Maschinencode alternativ: Eingabe Interpreter Ausgabe 11

Eine virtuelle Maschine ist eine idealisierte Hardware, für die sich einerseits leicht Code erzeugen lässt, die sich andererseits aber auch leicht auf realer Hardware implementieren lässt. Vorteile: Die Portierung auf neue Zielarchitekturen vereinfacht sich; der Compiler wird flexibler; die Realisierung der Programmkonstrukte wird von der Aufgabe entkoppelt, Hardware-Features auszunutzen. 12

Programmiersprachen, deren Übersetzungen auf virtuelle Maschinen beruhen: Pascal P-Maschine Smalltalk Bytecode Prolog WAM ( Warren Abstract Machine ) SML, Haskell STGM Java JVM 13

Hier werden folgende Sprachen und virtuelle Maschinen betrachtet: C CMa // imperativ PuF MaMa // funktional PuP WiM // logikbasiert Threaded C CMa+Threads // nebenläufig C + OMa // objektorientiert 14

Die Übersetzung von C 15

1 Die Architektur der CMa Jede virtuelle Maschine stellt einen Satz virtueller Instruktionen zur Verfügung. Instruktionen werden auf der virtuellen Hardware ausgeführt. Die virtuelle Hardware fassen wir als eine Menge von Datenstrukturen auf, auf die die Instruktionen zugreifen... und die vom Laufzeitsystem verwaltet werden. Für die CMa benötigen wir: 16

C 0 1 PC S 0 SP 17

S ist der (Daten-)Speicher, auf dem nach dem LIFO-Prinzip neue Zellen allokiert werden können == Keller/Stack. SP ( = Stack Pointer) ist ein Register, das die Adresse der obersten belegten Zelle enthält. Vereinfachung: Alle Daten passen jeweils in eine Zelle von S. C ist der Code-Speicher, der das Programm enthält. Jede Zelle des Felds C kann exakt einen virtuellen Befehl aufnehmen. PC ( = Program Counter) ist ein Register, das die Adresse des nächsten auszuführenden Befehls enthält. Vor Programmausführung enthält der PC die Adresse 0 == C[0] enthält den ersten auszuführenden Befehl. 18

Die Ausführung von Programmen: Die Maschine lädt die Instruktion aus C[PC] in ein Instruktions-Register IR und führt sie aus. Vor der Ausführung eines Befehls wird der PC um 1 erhöht. while (true) { } IR = C[PC]; PC++; execute (IR); Der PC muss vor der Ausführung der Instruktion erhöht werden, da diese möglicherweise den PC überschreibt :-) Die Schleife (der Maschinen-Zyklus) wird durch Ausführung der Instruktion halt verlassen, die die Kontrolle an das Betriebssystem zurückgibt. Die weiteren Instruktionen führen wir nach Bedarf ein :-) 19

2 Einfache Ausdrücke und Wertzuweisungen Aufgabe: werte den Ausdruck (1 + 7) 3 aus! Das heißt: erzeuge eine Instruktionsfolge, die den Wert des Ausdrucks ermittelt und dann oben auf dem Keller ablegt... Idee: berechne erst die Werte für die Teilausdrücke; merke diese Zwischenergebnisse oben auf dem Keller; wende dann den Operator an! 20

Generelles Prinzip: die Argumente für Instruktionen werden oben auf dem Keller erwartet; die Ausführung einer Instruktion konsumiert ihre Argumente; möglicherweise berechnete Ergebnisse werden oben auf dem Keller wieder abgelegt. loadc q q SP++; S[SP] = q; Die Instruktion loadc q benötigt keine Argumente, legt dafür aber als Wert die Konstante q oben auf dem Stack ab. 21

3 8 mul 24 SP--; S[SP] = S[SP] S[SP+1]; mul erwartet zwei Argumente oben auf dem Stack, konsumiert sie und legt sein Ergebnis oben auf dem Stack ab.... analog arbeiten auch die übrigen binären arithmetischen und logischen Instruktionen add, sub, div, mod, and, or und xor, wie auch die Vergleiche eq, neq, le, leq, gr und geq. 22

Beispiel: Der Operator leq 7 leq 3 1 Einstellige Operatoren wie neg und not konsumieren dagegen ein Argument und erzeugen einen Wert: 8 neg 8 S[SP] = S[SP]; 23

Beispiel: Code für 1 + 7: loadc 1 loadc 7 add Ausführung dieses Codes: loadc 1 1 loadc 7 7 1 add 8 24

Variablen ordnen wir Speicherzellen in S zu: z: y: x: Die Übersetzungsfunktionen benötigen als weiteres Argument eine Funktion ρ, die für jede Variable x die (Relativ-)Adresse von x liefert. Die Funktion ρ heißt Adress-Umgebung (Address Environment). 25

Variablen können auf zwei Weisen verwendet werden. Beispiel: x = y + 1 Für y sind wir am Inhalt der Zelle, für x an der Adresse interessiert. L-Wert von x = Adresse von x R-Wert von x = Inhalt von x code R e ρ code L e ρ liefert den Code zur Berechnung des R-Werts von e in der Adress-Umgebung ρ analog für den L-Wert Achtung: Nicht jeder Ausdruck verfügt über einen L-Wert (Bsp.: x + 1). 26

Wir definieren: code R (e 1 +e 2 ) ρ code R ( e) ρ code R q ρ code L x ρ = code R e 1 ρ code R e 2 ρ add... analog für die anderen binären Operatoren = code R e ρ neg... analog für andere unäre Operatoren = loadc q = loadc (ρx)... 27

code R x ρ = code L x ρ load Die Instruktion load lädt den Wert der Speicherzelle, deren Adresse oben auf dem Stack liegt. 13 load 13 13 S[SP] = S[S[SP]]; 28

code R (x = e) ρ = code R e ρ code L x ρ store Die Instruktion store schreibt den Inhalt der zweitobersten Speicherzelle in die Speicherzelle, deren Adresse oben auf dem Keller steht, lässt den geschriebenen Wert aber oben auf dem Keller liegen :-) 13 store 13 13 S[S[SP]] = S[SP-1]; SP--; 29