Die Entwicklung eines Quelltextes durchläuft in einem Übersetzungsvorgang beliebig viele Phasen, überspringt gegebenenfalls einzelne, wie zum Beispiel die Optimierung. Die letzte durchgeführte Phase klassifiziert die Sprache. Jede mir bekannte Programmiersprache lässt sich in dieses Phasen-Schema einordnen. Da das Modell auf Phasen aufbaut, definiere ich Programmiersprachen, die dieses Schema in beliebiger Form von oben nach unten durchlaufen als Phasenübersetzer.
Den Aufbau eines Phasenübersetzers lässt sich einfach beschreiben. Der Quellcode wird geladen, anschließend wird Phase für Phase geprüft, ob diese durchgeführt werden soll. Programmiert man diese Schritt Phase für Phase ab, so ergibt sich ein Programmablauf, der sich in einem Quelltext durch einfache if-Konstrukte ausdrücken ließe:
lexikalische Analyse
| |
| syntaktische Analyse
| | |
| | semantische Analyse
| | | |
| | | Zwischencodegenerierung
| | | | |
| | | | Optimierung
| | | | | |
| | | | | Codegenerierung
| | | | | | |
| | | | | | Linken
| | | | | | | |
| | | | | | | Produktinterpretation
| | | | | | | | |
| | | | | | | | dynamisches Binden
| | | | | | | | | |
| | | | | | | | | JIT-Kompilierung
| | | | | | | | | |
V V V V V V V V V V
Programm-Ausführung
In der Realität sind Phasen, in der Regel miteinander verwoben, ähnlich dem OSI-Modell, das Netzwerkverbindungen in sieben Schichten unterteilt, aber ebenso eher theoretischen Charakter besitzt.