Übersetzung von künstlichen Sprachen Formale Sprachen und Übersetzer
Agenda Motivation Formale Sprachen Compiler Compilerentwicklung Ausblick
Motivation Agenda Formale Sprachen Compiler Compilerentwicklung Ausblick
Compiler Werkzeug in der Softwareentwicklung Klassische Aufgaben eines Compilers Übersetzung eines Programms aus einer Quellsprache A in eine Zielsprache B Fehlermeldung und Fehlerbehandlung
Compiler vs. Interpreter Interpreter = direkte Programmausführung Compiler sind schneller und effizienter Kompilierte Programme ohne Compiler ausführbar
Formale Sprachen Agenda Motivation Compiler Compilerentwicklung Ausblick
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 ...
Terminologie Alphabet Wort Formale Sprache 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 Σ*
Terminologie Produktion Formale Grammatik 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
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
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} } Anwendung von P1 ω = aB Anwendung von P2 ω = ab
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
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
Compiler Agenda Motivation Formale Sprachen Compilerentwicklung Ausblick
Phasen der Übersetzung Lexikalische Analyse Syntaktische Analyse Semantische Analyse Zwischencode-Erzeugung Codeoptimierung Code-Erzeugung Symboltabellenverwaltung Fehlermeldung und Fehlerbehandlung
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 4 * 5 b 6 + 7
Syntaxanalyse (Parsing) Überprüfung auf syntaktische Korrektheit Konstruktion eines Syntaxbaums aus der Symboltabelle Mögliches Beispiel:
Semantische Analyse Typüberprüfung Eindeutigkeitsprüfung Gültigkeitsprüfung Erweiterung der Symboltabelle Erweiterung des Syntaxbaums
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 4 * 5 b 6 + 7
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
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
Symboltabellenverwaltung Querschnittsfunktion Symboltabelle = Datenstruktur mit Informationen über Symbole Schnelles Auffinden von Informationen Schnelles Abspeichern von Daten Oftmals Implementierung in Form einer Hash-Tabelle Id Symbol Attribute 1 A ... 2 = 3 4 * 5 b 6 + 7
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;
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
Werkzeuge Parser-Generatoren Scanner-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
Compilerentwicklung Agenda Motivation Formale Sprachen Compiler Ausblick
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
Planung eines Compilers Aspekte der Leistungsfähigkeit Compilergeschwindigkeit Codequalität Fehlerdiagnostik Portabilität Wartungsfreundlichkeit
Planung eines Compilers Entwicklungsumgebungen und Werkzeuge make-Befehl (UNIX) Profiler Lex Yacc Testen und Wartung Regressions-Tests Code-Kommentierungen Dokumentation
Bootstrapping Methode zur schrittweisen Compilerentwicklung Darstellungsform: T-Diagramm S = Quellsprache T = Zielsprache/Zielmaschine I = Implementierungssprache C = Compilername S C T I
Schrittweise Entwicklung mittels Bootstrapping Ziel: Implementierung eines C-Compilers für eine Linux-Maschine Schritt 1: C C2 Linux C C1 Linux ‘ C Linux ‘ C C1 Linux ‘ C1 gegeben C2 programmieren Linux ‘
Schrittweise Entwicklung mittels Bootstrapping Linux C C3 Linux C Linux ‘ C C1 Linux ‘ Linux ‘ C2 durch C1 kompilieren
Schrittweise Entwicklung mittels Bootstrapping Linux C C C2 Linux C C3 Linux C Linux ‘ C C1 Linux ‘ C4 programmieren Linux ‘
Schrittweise Entwicklung mittels Bootstrapping Linux C C5 Linux C Linux C C2 Linux C C3 Linux C Linux ‘ C C1 Linux ‘ C4 durch C3 kompilieren Linux ‘
Ausblick Agenda Motivation Formale Sprachen Compiler Compilerentwicklung Ausblick
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
Ende Fragen ????