Übersetzung von künstlichen sprachen formale sprachen und Übersetzer

Post on 05-Apr-2015

146 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Ü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 ????

top related