Vorlesungsskript - Institut für Programmierung und Reaktive Systeme
Vorlesungsskript - Institut für Programmierung und Reaktive Systeme
Vorlesungsskript - Institut für Programmierung und Reaktive Systeme
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
1 Einführung<br />
Eventuell schließt sich an die Phase der Code-Generierung noch eine maschinenabhängige<br />
Code-Optimierung an, die Ineffizienzen im erzeugten Maschinencode beseitigt<br />
(z.B. überflüssige Kopierbefehle entfernt oder einzelne Maschinenbefehle durch<br />
effizientere Befehle mit derselben Wirkung ersetzt).<br />
1.5.3 Front-End, Back-End<br />
Bei der Einteilung des Compilers in Phasen werden häufig die Begriffe Front-End<br />
<strong>und</strong> Back-End verwendet. Das Front-End eines Compilers umfaßt alle zielsprachenunabhängigen<br />
Compilerphasen, das Back-End entsprechend alle quellsprachenunabhängigen<br />
Phasen des Compilers.<br />
Für die Portierung eines Compilers auf eine andere Zielsprache kann i. allg. das Front-<br />
End unverändert weiterverwendet werden, so daß nur das entsprechende Back-End<br />
neu implementiert werden muß. Im umgekehrten Fall kann die Verbindung mehrerer<br />
Front-Ends mit einem gemeinsamen Back-End sinnvoll sein, um innerhalb eines Programms<br />
Teilprogramme in einer jeweils <strong>für</strong> das Teilproblem optimalen Programmiersprache<br />
zu schreiben <strong>und</strong> aus diesen Teilprogrammen ein gemeinsames Zielprogramm<br />
zu erzeugen.<br />
1.5.4 Läufe<br />
Es ist üblich, mehrere Übersetzungsphasen in einem einzelnen Lauf (pass) zu implementieren.<br />
Ein Lauf steht dabei <strong>für</strong> einen Durchlauf durch eine Darstellung des<br />
Programms. Dabei kann es sich sowohl um den Quelltext als auch um eine interne<br />
Darstellung des Programms wie z.B. den Syntaxbaum handeln. Dabei bietet es<br />
sich an, Phasen, deren Arbeitsschritte eng miteinander verzahnt sind, in einem Lauf<br />
zusammenzufassen. Eine Möglichkeit wäre zum Beispiel die Integration von lexikalischer<br />
<strong>und</strong> syntaktischer Analyse in einem Lauf sowie der semantischen Analyse <strong>und</strong><br />
der Codegenerierung in einem zweiten Lauf.<br />
Einen Extremfall stellt der Ein-Pass-Compiler dar, der die Analyse des Quellprogramms<br />
<strong>und</strong> die Synthese des Zielprogramms während eines einzigen Durchlaufs<br />
durch den Programmtext durchführt. In diesem Fall muß gewährleistet sein, daß<br />
jeder Bezeichner vor seiner Verwendung deklariert wurde, da nachträgliche Änderungen<br />
am Zielprogramm nicht mehr möglich sind. Aus diesem Gr<strong>und</strong> ist in vielen<br />
Compilern <strong>für</strong> die Sprache Pascal [JW91] die Vordeklaration von Bezeichnern mit<br />
der forward-Anweisung vorgesehen.<br />
Andere Programmiersprachen wie z.B. Algol-68 [OT97] erlauben die Verwendung von<br />
Bezeichnern vor ihrer Deklaration, so daß <strong>für</strong> diese Sprachen die Implementierung<br />
mittels eines Ein-Pass-Compilers nicht möglich ist.<br />
Bei der Implementierung einer Sprache mittels einer virtuellen Maschine gilt: Der<br />
12