7. Semantisch gerichtete Compilergenerierung

Bei der semantisch gerichteten Compilergenerierung geht es um die automatische Erzeugung von Compilern. Hier muß man sich nicht (wie bei traditionellen Compiler-Schreib-Werkzeugen) um die Sicherung der Erzeugung von korrektem Code kümmern.
Der Grund für die Anwendung der automatischen Compilergenerierung ist vor allem Korrektheit. Während man, wenn man per Hand einen Compiler schreibt, eine Sprachspezifikation erarbeiten, einen Compiler entsprechend dieser Spezifikation schreiben und den Compiler auf Korrektheit prüfen muß, reduziert sich der Aufwand 'nur' auf das Schreiben der Sprachspezifikation (in einer Form, die für den Compilergenerator lesbar ist). Folglich werden Fehler, die beim Schreiben des Compilers auftreten können, eliminiert.

7.1 Parser und Compilergeneratoren


Bild

cogen stellt in diesem Bild einen Compilergenerator dar, d.h. ein Programm, das aus einer Sprachspezifikation int einen alleinstehenden Compiler Int-gen erzeugt. Int-gen übersetzt ein Quellprogramm in ein Zielprogramm.
Ein ähnliches Bild erhält man für die Erzeugung eines alleinstehenden Parsers.

Auch hier kommt man mittels partieller Auswertung weiter, d.h. man kann über partielle Auswertung einen alleinstehenden Compiler erzeugen. Mit anderen Worten, cogen kann durch partielle Auswertung realisiert werden. Dies wird durch Selbstanwendung ermöglicht. Selbstanwendung bedeutet hierbei, daß der partielle Auswerter mix sich selbst als Eingabe erhält.

Formal gilt : compiler = [|mix|] [mix,int] .

Compiliert man durch partielle Auswertung, nimmt man einen partiellen Auswerter 'mix' mit den beiden Eingaben int und source. Spezialisiert man diesen mix auf seine erste Eingabe, nämlich int, hat man eine spezialisierte Version, mit der gleichen Ausgabe wie das Original bei gleicher zweiter Eingabe. Da die Ausgabe eines partiellen Auswerters als Compiler ein übersetztes Programm ist, ist es dies auch in der spezialisierten Version, wobei die erste Eingabe int weggelassen wird. So ist die Ausgabe ein Compiler, und so kann man mittels partieller Auswertung einen Compiler erzeugen.

target = [|mix |] [int,source] (1)
= [| [| mix |] [mix,int] |] source (2)
= [| compiler|] source (3)

Die Gleichung compiler = [|mix|] [mix,int] wird zweite Futamuraprojektion genannt.