Compiler: Einführung

Ähnliche Dokumente
Was ist ein Compiler?

Compilerbau mit Phoenix

Einführung in die Systemprogrammierung

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

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

Alphabet, formale Sprache

FAKULTÄT FÜR INFORMATIK

Interpreter - Gliederung

Struktur und Implementierung von Programmiersprachen I. (Compilerbau) SS 2006

Computergrundlagen Programmiersprachen, Interpreter, Compiler, Linker

Compiler, Übersetzer. Allgemeine Erklärung / Definition

Formale Sprachen und Grammatiken

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

Fachseminar WS 2008/09

Übersetzergenerierung mit lex und yacc

11. Rekursion, Komplexität von Algorithmen

Software Entwicklung 2. Übersetzerbau 1

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen. I.2. I.2. Grundlagen von von Programmiersprachen.

Interdisziplinäre fachdidaktische Übung: Modelle für Sprachen in der Informatik. SS 2016: Grossmann, Jenko

Grammatiken und ANTLR

Modellierung und Programmierung 1

Was ist Informatik? Alexander Lange

Übersicht über 1. Vorlesungsabschnitt Form und Darstellung von Informationen

Kapitel 1: Einführung

Tooldemo: Soot. Softwareanalyse SS 2011 Veranstalter: Prof. Dr. Klaus Ostermann Tillmann Rendel, M.Sc. Von Kim Maurice Nuspl

Werkzeuge zur Programmentwicklung

4. 4. Algorithmen und Datenstrukturen in deskriptiven Programmiersprachen

CPU-Caches. Christian Duße. Seminar Effiziente Programmierung in C

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

Coma I. Einleitung. Computer und Algorithmen. Programmiersprachen. Algorithmen versus Programmiersprachen. Literaturhinweise

Formale Sprachen und Automaten

Algorithmen und Formale Sprachen

Werkzeuggestützte Softwareprüfungen Statische Analyse und Metriken

Generierung von Steuerungsprogrammcode für SPS und μc aus Petri-Netz-Modellen

Grundbegriffe der Informatik

10 Erweiterung und Portierung

Kapitel 4: Syntaxdiagramme und Grammatikregeln

Kapitel 2: Formale Sprachen Gliederung. 0. Grundbegriffe 1. Endliche Automaten 2. Formale Sprachen 3. Berechnungstheorie 4. Komplexitätstheorie

Universität Karlsruhe (TH)

1. Java Grundbegriffe

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

Einführung in die Programmierung mit Java

JAVA als erste Programmiersprache Semesterkurs

Einführung in die Computerlinguistik Einführung in Python (1)

WS 2009/10. Diskrete Strukturen

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

Freihand-Editieren von mathematischen Formeln

Funktionale Programmiersprachen

Semantische Bewertung und personalisierte Erzeugung von Übungsaufgaben zu Mathematik, Logik, Informatik

Einführung in die objektorientierte Programmierung. mit Squeak

Übung Theoretische Grundlagen

Übersetzung objektorientierter Programmiersprachen

1 ÜBERSETZER. Compilerbau 1

Einführung in Generatives Programmieren. Bastian Molkenthin

Static-Single-Assignment-Form

Algorithmen und Datenstrukturen (AuD) Prof. Dr. Claudia Eckert

Seite Seite 2

Raytracing auf Desktop PCs Optimizing Cache Usage (Intel Corp.)

C-PROGRAMMIERUNG - STRUKTUREN. Marcel Lebek

Einführung in die Informatik I (autip)

Brainfuck. 1 Brainfuck. 1.1 Brainfuck Geschichte und Umfeld. 1.2 Esoterische Programmiersprachen

Vorlesung Objektorientierte Softwareentwicklung. Kapitel 0. Java-Überblick

Diskrete Strukturen Kapitel 1: Einleitung

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

Zwischencodeerzeugung Compiler II

Inhaltsverzeichnis. Was ist Informatik? 5. Programmierung 13. Einleitung. 1 Informatik Was ist Informatik? Teilgebiete der Informatik 8

Programmierkurs II. C und Assembler

Einleitung und Begriffliches. Einleitung. Programmiersprachen. Software-Komplexität ist inhärent und hat vor allem folgende Ursachen

Automaten und Formale Sprachen alias Theoretische Informatik. Sommersemester 2013

Ausarbeitung des Interpreter Referats

Definition von domänenspezifischen Sprachen mit Xtext: Einführung. 19. November 2014

Grundlagen der Theoretischen Informatik

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 1. Einführung und Grundbegriffe

Einführung in die Programmierung

Sprachübersetzer, T-Diagramme, Compiler, Scanner und Parser

Programmieren Formulierung eines Algorithmus in einer Programmiersprache

2.2 Rechnerorganisation: Aufbau und Funktionsweise

Grundbegriffe. Grammatiken

Grundlagen der Informatik Übungen 1.Termin

Mächtigkeit von WHILE-Programmen

Assembler - Einleitung

LISE MEITNER GYMNASIUM NEUENHAUS UELSEN

VBA-Programmierung: Zusammenfassung

7. Formale Sprachen und Grammatiken

Theorie der Informatik. Theorie der Informatik. 6.1 Einführung. 6.2 Alphabete und formale Sprachen. 6.3 Grammatiken. 6.4 Chomsky-Hierarchie

2 Grundlagen der Programmierung

6. Iteration (Schleifenanweisungen)

Einführung Grundbegriffe

Deterministischer Kellerautomat (DPDA)

Formale Sprachen. Script, Kapitel 4. Grammatiken

Syntax von Programmiersprachen

Übung 1 - Betriebssysteme I

Einführung in die Programmierung 1

Projekt Systementwicklung

Transkript:

Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 10.05.2017 15:49 Inhaltsverzeichnis Ein Compiler................................... 2 Ein Compiler................................... 2 Das Studium vom Compilerbau......................... 2 Konzeptionelle Roadmap.............................. 2 Programmiersprachen............................... 3 Compiler...................................... 3 Interpreter...................................... 3 Kombinationen................................... 4 oft als JIT................................... 4 Warum sollten Sie sich mit Compilerdesign beschäftigen............ 4 Theorie und Praxis................................. 4 Die elementaren Prinzipien der Compilierung.................. 5 Erstes Prinzip................................. 5 Zweites Prinzip................................ 5 Compilerstruktur.................................. 5 Compilerstruktur................................. 5 Optimierer..................................... 6 Überblick über die Compilierung 6 Frontend....................................... 6 Scanner....................................... 7 Parser........................................ 7 Typüberprüfung (type checking).......................... 7 Zwischenrepräsentation............................... 8 Zwischenrepräsentation: Beispiel Graph...................... 8 Zwischenrepräsentation: Beispiel lowlevel, sequentieller Code.......... 8 1

Der Optimierer................................... 9 Beispiel....................................... 9 Das Backend.................................... 10 Ein Compiler ist ein Computerprogramm das ein Programm geschrieben in einer Sprache in ein Programm geschrieben in einer anderen Sprache übersetzt Ein Compiler ist ein großes Softwaresystem mit vielen internen Komponenten, Algorithmen und komplexen Interaktionen zwischen beiden Das Studium vom Compilerbau ist eine Einführung in Techniken für die Übersetzung und Optimierung von Programmen und eine praktische Übung in Software Engineering Konzeptionelle Roadmap ein Compiler muss die Syntax und die Bedeutung Letzte Änderung: 10.05.2017 15:49 2

der Eingabesprache sowie die Syntax und die Bedeutung der Ausgabesprache verstehen und ein Compiler benötigt ein Abbildungsschema von der Quell- zur Zielsprache Programmiersprachen formale Sprachen haben rigide Eigenschaften und Bedeutungen sind so entworfen, dass sie keine Mehrdeutigkeiten enthalten Compiler Quellsprachen z.b. Java, C, C++, Zielsprachen z.b. Maschinensprache, Bytecode für die JVM oder.net es gibt aus source-to-source-translators z.b. Übersetzung einer neuen Programmiersprache nach C und andere, z.b. LaTeX to PostScript Markdown to HTML Interpreter führen ein Programm aus benötigen aber auch Scanner, Parser, Zwischenrepräsentationen, z.b. Python, Perl, Scheme, Letzte Änderung: 10.05.2017 15:49 3

Kombinationen Compiler nach Bytecode Bytecode wird von einem Interpreter ausgeführt oft als JIT Compiler der zur Laufzeit übersetzt just-in-time compiler Warum sollten Sie sich mit Compilerdesign beschäftigen Ein Compiler enthält einen Informatik-Mikrokosmos gierige (greedy) Algorithmen (register allocation) heuristische Suchtechniken (list scheduling) Graphalgorithmen (dead-code elimination) dynamische Programmierung (instruction selection) endliche Automaten und Kellerautomaten (scanning and parsing) Fixpunktalgorithmen (data-flow analysis) Ein Compiler muss mit folgenden Problemen umgehen können dynamischer Allokation Synchronization Namensgebung Lokalität hierarchischem Speichermanagement Pipelinescheduling Theorie und Praxis Compiler demonstrieren den erfolgreiche Anwendung der Theorie auf praktische Probleme Werkzeuge zum Generieren von Scannern und Parsern wenden Ergebnisse aus der formalen Sprachtheorie an die selben Werkzeuge werden für die Textsuche, das Filtern von Websites, die Textverarbeitung und Kommandozeileninterpreter verwendet Typüberprüfung und statische Analyse wenden Ergebnisse der Verbandstheorie, der Zahlentheorie und anderer mathematischer Teilgebiete an Letzte Änderung: 10.05.2017 15:49 4

Codegeneratoren benutzen Algorithmen für die Mustererkennung in Bäumen, das Parsen, die dynamische Programmierung und Textvergleiche Die elementaren Prinzipien der Compilierung Erstes Prinzip Der Compiler muss die Bedeutung des zu compilierenden Programms erhalten. Zweites Prinzip Der Compiler muss das Eingabeprogramm auf wahrnehmbare Art und Weise verbessern. Compilerstruktur Ein 2-Phasen-Compiler Compilerstruktur das Frontend muss seine Kenntnis der Quellsprache nutzen Letzte Änderung: 10.05.2017 15:49 5

muss sicherstellen, dass das Quellprogramm wohlgeformt ist die Zwischenrepräsentationen (intermediate representation, IR) ist die maßgebliche Repräsentation des Codes für den Compiler es kann mehrere Zwischenrepräsentationen für verschiedene Compilerphasen geben das Backend muss die IR abbilden auf die Befehlsmenge und die endlichen Ressourcen Optimierer Ein 3-Phasen-Compiler Überblick über die Compilierung Frontend muss die Programmstruktur mit deiner Sprachdefinition vergleichen formale Definition = endliche Menge von Regeln = Grammatik, z.b. Satz Subjekt Verb Objekt Satzendezeichen Letzte Änderung: 10.05.2017 15:49 6

Verb und Satzendezeichen sind Teile der Sprache Satz, Subjekt und Objekt sind syntaktische Variablen das Symbol heisst leitet her Scanner Beispiel: Compiler sind technische Objekte. der Scanner nimmt diesen Zeichenstrom und wandelt ihn um in einen Strom von klassifizierten Worten Beispiel: (Substantiv, Compiler ), (Verb, sind ), (Adjektiv, technische ), (Substantiv, Objekte ), (Satzendezeichen,. ) Parser Regeln 1. Satz Subjekt Verb Objekt Satzendezeichen 2. Subjekt Substantiv 3. Subjekt Modifikator Substantiv 4. Objekt Substantiv 5. Objekt Modifikator Substantiv 6. Modifikator Adjektiv wenn es möglich ist eine Herleitung zu finden, die mit dem Nichtterminal Satz startet und endet mit Substantiv Verb Adjektiv Substantiv Satzendezeichen dann gehört der Satz Compiler sind technische Objekte. zur Sprache der Prozess der automatisch nach so einer Herleitung sucht heisst Parsen Typüberprüfung (type checking) das Frontend ist außerdem dafür zuständig Typkonsistenz zu überprüfen z.b. Letzte Änderung: 10.05.2017 15:49 7

a = a * 2 * b * c * d mag syntaktisch wohlgeformt sein aber wenn b und d Zeichenketten sind, ist der Ausdruck ungültig Zwischenrepräsentation Ziel des Frontends ist eine Zwischenrepräsentation des Codes zu erzeugen verschiedene Formen Graphen Assemblerprogramme Zwischenrepräsentation: Beispiel Graph DAG für a = a 2 b c d Zwischenrepräsentation: Beispiel lowlevel, sequentieller Code Lolevel, sequentieller Code für a = a 2 b c d: Letzte Änderung: 10.05.2017 15:49 8

t0 = a * 2 t1 = t0 * b t2 = t1 * c t3 = t2 * d a = t3 Der Optimierer analysiert die Zwischenrepräsentation und schreibt den Code so um, dass er das selbe berechnet, aber in einer effizienteren Art und Weise reduziert die Laufzeit der Anwendung oder reduziert die Größe des generierten Codes oder reduziert die Energie die der Prozessor verbraucht oder Beispiel ursprünglicher Code b =... c =... a = 1 for i = 1 to n read d a = a * 2 * b * c * d end verbesserter Code... t = 2 * b * c for i = 1 to n read d a = a * d * t end besser aber als ProgrammiererIn nicht darauf verlassen, sondern selbst schon guten Code schreiben Letzte Änderung: 10.05.2017 15:49 9

Das Backend durchläuft die Zwischenrepräsentation gibt Code für die Zielplattform aus Instruction Selection wählt die Maschinenbefehle aus die der jeweiligen IR-Operation entsprechen Register Allokation entscheidet welche Werte in Registern und welche im Hauptspeicher gehalten werden Instruction Scheduling ermittelt die Reihenfolge in der die Befehle effizient ausgeführt werden können Letzte Änderung: 10.05.2017 15:49 10