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:
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?)