Definition Compiler. Bekannte Compiler

Compiler Inhalt: • Definition Compiler / bekannte Compiler • Klassifikationen von Compilern •Analyse-Synthese-Modell der Kompilierung •Analyse des Que...
Author: Monika Waltz
0 downloads 1 Views 84KB Size
Compiler Inhalt: • Definition Compiler / bekannte Compiler • Klassifikationen von Compilern •Analyse-Synthese-Modell der Kompilierung •Analyse des Quellprogramms •Synthesephase •Die Phasen eines Compilers •Symboltabellenverwaltung / Fehlerbehandlung •Umgebung eines Compilers •Möglichkeiten zur Vereinfachung eines Compilers •Stark vereinfachte Graphik zum kompletten Compilerprozess

Definition Compiler Ein Compiler ist ein Programm, dass ein in einer bestimmten Sprache (Quell-Sprache) geschriebenes Programm in ein äquivalentes Programm einer anderen Sprache (Ziel-Sprache) übersetzt. Eine wichtige Teilaufgabe besteht darin, Fehler im Quellprogramm zu finden.

Bekannte Compiler GNU Compiler Collection (GCC) Intel C++ Compiler (ICC) Microsoft Visual C++ Borland C++Builder

Klassifikationen von Compilern Ein-Pass-Compiler: • Durchlauf: 1 • Resultat: ausführbare Datei Mehr-Pass-Compiler: Bei diesem Compiler wird der Quellcode auch einmal durchlaufen. Dabei wird der Durchlauf intern zerteilt und in mehrere Elemente zwischengespeichert.Die ausführbare Datei wird aus den zwischengespeicherten Elementen generiert Load-and-Go Compiler: • nach kompilieren direkt ausführbare Datei • z.B. gcc test.c müsste direkt was starten ? Interpreter: (z.B. Python) • keine ausführbare Datei • zur Laufzeit: Code einlesen, analysieren, ausführen

Übersetzungsprozess (Kompilierprozess)

Analyse-Teil (Frontend) Im Frontend wird der Code analysiert, Strukturiert (Zwischendarstellung als Baum) und auf Fehler überprüft.

Synthese-Teil (Backend) Im Backend: Konstruktion d. Zielprogramms aus der Zwischendarstellung (wird nicht Detailliert betrachtet)

Die Analyse des Quellprogramms

• Lexikalische Analyse

• Syntaktische Analyse

• Semantische Analyse

Lexikalische Analyse Bei der lexikalischen Analyse wird der Quelltext von links nach rechts gelesen und anschließend in zusammengehörende Token verschiedener Klassen unterteilt, z. B. Schlüsselwörter, Bezeichner, Zahlen und Operatoren. Beispiel:

position := initial + rate * 60 1. Bezeichner 2. Zuweisungssymbol 3. Bezeichner 4. Plus-Zeichen 5. Bezeichner 6. Multiplikations-Zeichen 7. Zahl

      

position := initial + rate * 60

Syntaktische Analyse Die syntaktische Analyse überprüft, ob der eingelesene Quellcode ein korrektes Programm der zur übersetzenden Quellsprache ist, d.h., der Syntax (Grammatik) der Quellsprache entspricht. Dabei wird die Eingabe in einen Syntaxbaum umgewandelt. Dieser Teil wird auch als Parser bezeichnet. Falls der Quellcode nicht zur Grammatik der Quellsprache passt, gibt der Parser einen Syntaxfehler aus. Syntaxbaum (position := initial + rate * 60 ) := position

+ initial

* rate

60

Semantische Analyse Das Programm wird auf semantische Richtigkeit überprüft, wobei die in der Syntaxanalyse ermittelte hierarchische Struktur zugrunde gelegt wird. Wesentliche Elemente der semantischen Analyse sind etwa: :=

• Typprüfungen • Eindeutigkeitsprüfungen

+

int int

• Gültigkeitsprüfungen

* position

initial char

rate

60

Synthesephase

Zwischencodeerzeugung: Viele moderne Compiler erzeugen aus dem Syntaxbaum einen Zwischencode, der schon relativ maschinennah sein kann und führen auf diesem Zwischencode z.B. Programmoptimierungen durch.

Codegenerierung: Erzeugung von Zielcode in Maschinencode oder Assemblercode.

Die Phasen eines Compilers

Symboltabellenverwaltung Speicherung der im Quellprogramm benutzten Namen und deren Attribute (Speicherbedarf, Typ, Gültigkeitsbereich, Wert, ...). Wann wird was in die Symboltabelle eingetragen? lexikalische Analyse

→ Namen

syntaktische Analyse

→ z.B. Gültigkeitsbereich

semantische Analyse

→ z.B. Gültigkeitsbereich

Code-Erzeugung

→ Attribute bezügl. Speicherplatz

Fehlerbehandlung Jede Phase kann auf Fehler stoßen. Ein Fehler muss auf geeignete Weise behandelt werden. (wieso?)

Umgebung eines Compilers

Möglichkeiten der Vereinfachung eines Compilers

:=

:= +

int

position

+

int

*

position:=initial+rate*60;

initial

position

*

position:=initial+rate*60; rate

60

initial char

rate

60