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 position 2. Zuweisungssymbol := 3. Bezeichner initial 4. Plus-Zeichen + 5. Bezeichner rate 6. Multiplikations-Zeichen * 7. Zahl 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 + Gültigkeitsprüfungen position int initial char * 60 rate
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 syntaktische Analyse semantische Analyse Code-Erzeugung Namen z.b. Gültigkeitsbereich z.b. Gültigkeitsbereich 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
:= := position:=initial+rate*60; position:=initial+rate*60; position + initial * int position int initial + char * 60 rate 60 rate