Post on 05-Apr-2015
Übersetzung von künstlichen Sprachen
Formale Sprachen und Übersetzer
2
Agenda
1. Motivation
2. Formale Sprachen
3. Compiler
4. Compilerentwicklung
5. Ausblick
3
Agenda
1. Motivation2. Formale Sprachen
3. Compiler
4. Compilerentwicklung
5. Ausblick
4
Compiler
Werkzeug in der Softwareentwicklung
Klassische Aufgaben eines Compilers
Übersetzung eines Programms aus einer Quellsprache A in eine
Zielsprache B
Fehlermeldung und Fehlerbehandlung
5
Compiler vs. Interpreter
Interpreter = direkte Programmausführung
Compiler sind schneller und
effizienter
Kompilierte Programme ohne
Compiler ausführbar
6
Agenda
1. Motivation
2. Formale Sprachen3. Compiler
4. Compilerentwicklung
5. Ausblick
7
Formale Sprachen
Grundlage der systematischen Sprachanalyse
Beim Entwurf von Programmiersprachen und bei der Analyse von
Programmen eingesetzt
Beispiele für formale Sprachen:
Programmiersprachen, wie C oder Java
Abfragesprachen wie SQL
Algebraische Ausdrücke
...
8
Terminologie
Alphabet
Ein Alphabet Σ ist eine endliche, nicht leere Menge von Symbolen
Wort
Ein Wort ω über Σ ist eine endliche Folge von Symbolen aus Σ. Das leere
Wort wird mit ε bezeichnet. Σ* ist die Menge aller Worte über Σ
Formale Sprache
Eine Sprache L ist eine Teilmenge von Σ*
9
Terminologie
Produktion
Eine Produktion P ist eine Vorschrift zur Ersetzung von Wörtern durch
andere Wörter
Formale Grammatik
Eine formale Grammatik G beschreibt Regeln, wie aus einem Alphabet Σ
Worte ω einer bestimmten Sprache L gebildet werden
10
Formale Grammatiken
Eine formale Grammatik G ist ein Vierer-Tupel (N, Σ, P, S):
N = Menge der Nichtterminalsymbole
Σ = Menge der Terminalsymbole
N und Σ sind zueinander disjunkt, es gilt somit N Σ =
X := N Σ ist das Totalalphabet
P ist die endliche Menge der Produktionen oder Ableitungsregeln
S N bezeichnet das Startsymbol
Formale Grammatiken erzeugen formale Sprachen Synthese
Formale Grammatiken werden zur Sprachanalyse
eingesetzt Analyse
11
Anwendung von Ableitungsregeln
Vorgehensweise:
Ausgangspunkt ist das Startsymbol S
S gemäß Produktion durch rechte Seite der Produktion ersetzen
Falls das resultierende Wort noch Nichtterminalsymbole enthält,
Anwendung einer weiteren Produktion
Wiederholung so lange, bis das resultierende Wort nur noch
Terminalsymbole enthält
Beispiel: G = { {A,B}, {a,b}, {P1: A a, P2: B b}, {AB} }
1. Anwendung von P1 ω = aB
2. Anwendung von P2 ω = ab
12
Chomsky-Hierarchie
1956 von Noam Chomsky entwickelt
Typ-0 Grammatik: Unbeschränkte Grammatik
Keinerlei Einschränkungen
Typ-1 Grammatik: Kontextsensitive Grammatik
P1: αAβ αγβ, mit A N, γ X\{ε} , α, β X*
P2: S ε
Terminalsymbole auf der linken Seite einer Produktionsregel erlaubt
13
Chomsky-Hierarchie
Typ-2 Grammatik: Kontextfreie Grammatik
P: A α, mit A N und α X*
Terminalsymbole nicht auf der linken Seite einer Produktionsregel erlaubt
Definition der syntaktischen Struktur
Typ-3 Grammatik: Reguläre Grammatik
P1: A Bω oder P1: A ωB
P2: A ω, mit A, B N und ω Σ *
Definition der lexikalischen Struktur
14
Agenda
1. Motivation
2. Formale Sprachen
3. Compiler4. Compilerentwicklung
5. Ausblick
15
Phasen der Übersetzung
Lexikalische Analyse
Syntaktische Analyse
Semantische Analyse
Zwischencode-Erzeugung
Codeoptimierung
Code-Erzeugung
Symboltabellenverwaltung
Fehlermeldung und Fehlerbehandlung
Lexikalische Analyse
Syntax-Analyse
Semantische Analyse
Zwischencode-Erzeugung
Code-Optimierung
Code-Erzeugung
Symboltabellen-
verwaltung
Fehler-behandlung
Analyse
Synthese
16
Lexikalische Analyse (Scanning)
Aufteilung des Stroms von Eingabezeichen in Symbole
Überprüfung auf gültige Eingabezeichen
Herausfiltern von Leerzeichen und Symbolen
Mögliches Beispiel: Ausdruck A = 2*b+6
Bezeichner: A, b
Zahlen: 2, 6
Zuweisungssymbol: = Symboltabelle
Pluszeichen: +
Multiplikationszeichen: *
}Id Symbol Attribute
1 A ...
2 = ...
3 2 ...
4 * ...
5 b ...
6 + ...
7 6 ...
17
Syntaxanalyse (Parsing)
Überprüfung auf syntaktische Korrektheit
Konstruktion eines Syntaxbaums aus der Symboltabelle
Mögliches Beispiel:
18
Semantische Analyse
Typüberprüfung
Eindeutigkeitsprüfung
Gültigkeitsprüfung
Erweiterung der Symboltabelle
Erweiterung des Syntaxbaums
19
Zwischencode-Erzeugung
Reduktion der Komplexität des Kompiliervorgangs
Erzeugung einer maschinenunabhängigen Form
Zwischencode ist portierbar
Mögliches Beispiel: Drei-Adress-Code
temp1 := 6
temp2 : = 2
temp3 := id5 * temp2
temp4 := temp3 + temp1
id1 := temp4
Id Symbol Attribute
1 A ...
2 = ...
3 2 ...
4 * ...
5 b ...
6 + ...
7 6 ...
20
Code-Optimierung
Auffinden und Beseitigen von Ineffizienzen
Benutzung maschinenspezifischer Befehle
Elimination von nicht erreichbaren Programmcode
Optimierung von Schleifen
Einsparung von Maschinenbefehlen
Beispiel:
temp1 := id5 * 2
id1 := temp1 + 6
21
Code-Erzeugung
Erzeugung des finalen Zielcodes
Umwandlung der Instruktionen in funktionserhaltende Folgen von
Maschinenbefehlen
Speicherallokation für die im Programm verwendeten Variablen
Mögliches Beispiel:
MOV id5, R1
MUL 2, R1
ADD 6, R1
MOV R1, id1
22
Symboltabellenverwaltung
Querschnittsfunktion
Symboltabelle = Datenstruktur mit Informationen über Symbole
Schnelles Auffinden von Informationen
Schnelles Abspeichern von Daten
Oftmals Implementierung in Form einer Hash-TabelleId Symbol Attribute
1 A ...
2 = ...
3 2 ...
4 * ...
5 b ...
6 + ...
7 6 ...
23
Fehlerbehandlung und -meldung
Querschnittsfunktion
Fortführung des Kompiliervorgangs nach Auftreten eines Fehlers
Großteil der Fehler in den Phasen Syntaxanalyse und semantische
Analyse
Beispiel:
String s = 5;
24
Systemumgebung eines Compilers
Präprozessor
Vorbereitung und Erzeugung der Eingabe
Assembler
Übersetzung von Assemblersprache in die
Zielsprache
Lader/Binder
Anfordern von Speicherbereichen, Umrechnung
von relative in absolute Adressen und Laden
des Programms in den Arbeitsspeicher
Zusammenstellung des Programms aus einzelnen
Programmmodulen
Präprozessor
Compiler
Assembler
Lader/Binder
Rohes Quellprogramm
Quellprogramm
Ziel-Assemblerprogramm
Verschiebbarer Maschinencode
Ausführbarer Maschinencode
25
Werkzeuge
Parser-Generatoren
Automatische Erzeugung eines Parsers mit Hilfe kontextfreier Grammatiken
Scanner-Generatoren
Automatische Erzeugung eines Scanners anhand einer Spezifikation
Syntaxgesteuerte Übersetzungsmaschinen
Automatische Zwischencode-Erzeugung auf Basis eines Syntaxbaums
Automatische Code-Generatoren
Umwandlung von Zwischencode-Anweisungen in Zielcode
Datenflussmaschinen
Optimierung des Datenflusses
26
Agenda
1. Motivation
2. Formale Sprachen
3. Compiler
4. Compilerentwicklung5. Ausblick
27
Planung eines Compilers
Gegebenheiten der Quellsprache
Größe der Sprache problematisch!!
Ausdehnungsgeschwindigkeit der Sprache
Gegebenheiten der Zielsprache
Überprüfung auf Korrektheit
Überprüfung des Laufzeitverhaltens
28
Planung eines Compilers
Aspekte der Leistungsfähigkeit
Compilergeschwindigkeit
Codequalität
Fehlerdiagnostik
Portabilität
Wartungsfreundlichkeit
29
Planung eines Compilers
Entwicklungsumgebungen und Werkzeuge
make-Befehl (UNIX)
Profiler
Lex
Yacc
Testen und Wartung
Regressions-Tests
Code-Kommentierungen
Dokumentation
30
Bootstrapping
Methode zur schrittweisen Compilerentwicklung
Darstellungsform: T-Diagramm
S = Quellsprache
T = Zielsprache/Zielmaschine
I = Implementierungssprache
C = Compilername
S C T
I
31
Schrittweise Entwicklung mittels Bootstrapping
Ziel: Implementierung eines C-Compilers für eine Linux-Maschine
Schritt 1:
C C1 Linux ‘
Linux ‘
C C2 Linux
C C C1 Linux ‘
Linux ‘
C2 programmierenC1 gegeben
32
Schrittweise Entwicklung mittels Bootstrapping
Schritt 2:
C C2 Linux
C C C1 Linux ‘
Linux ‘
C C3 Linux
Linux ‘
C2 durch C1 kompilieren
33
Schrittweise Entwicklung mittels Bootstrapping
Schritt 3:
C C2 Linux
C C C1 Linux ‘
Linux ‘
C C3 Linux
Linux ‘
C C4 Linux
C
C4 programmieren
34
Schrittweise Entwicklung mittels Bootstrapping
Schritt 4:
C C2 Linux
C C C1 Linux ‘
Linux ‘
C C3 Linux
Linux ‘
C C4 Linux
C
C4 durch C3 kompilieren
C C5 Linux
Linux
35
Agenda
1. Motivation
2. Formale Sprachen
3. Compiler
4. Compilerentwicklung
5. Ausblick
36
Zusammenfassung und Ausblick
Compiler übersetzen Programme von einer Quellsprache A in eine
Zielsprache B
Formale Sprachen bilden die Basis
Übersetzungsvorgang umfasst verschiedene Phasen
Diverse Programme und Werkzeuge zur Unterstützung
Bootstrapping als Methode zur schrittweisen Compilerentwicklung
Compiler sind von enormer Bedeutung in der Software-Entwicklung
Viele Herausforderungen im Bereich des Compilerbaus noch zu meistern
Beispiel: Automatische Übersetzung natürlicher Sprachen
37
Ende
Fragen ????