6. Compilierung durch partielle Auswertung

Wenn man sich die Gründe, die für Compilierung bzw. Interpretation sprechen und die entsprechenden Bilder ansieht, kann man eine verblüffende Ähnlichkeit mit den Bildern und den Gründen für partielle Auswertung feststellen. Der Hauptgrund für die Compilierung ist der gleiche wie für partielle Auswertung, nämlich Effizienz. Auch die Bilder ähneln sich sehr stark. Die Umbenennung einiger Kästchen und eine Art innere Eingabe des Compilers in Form einer Sprachspezifikation führt sogar zum gleichen Bild.
Da auch die Ausgabesprache eines partiellen Auswerters nicht mit der Sprache des Quellprogramms übereinstimmen muß, kann man einen partiellen Auswerter zur Compilierung verwenden.
Man spezialisiert dazu einen Interpreter auf ein festes Quellprogramm, wobei die Ausgabe des partiellen Auswerters (meist) nicht mit der Quellsprache übereinstimmt. Die Ausgabe ist ein Programm, das bei Ausführung auf der restlichen Eingabe (die Laufzeiteingabe) die gleiche Ausgabe erzeugt, wie der Interpreter mit beiden Eingaben produzieren würde. Dieses Programm ist allein lauffähig und entspricht so der Ausgabe eines Compilers, nämlich einem übersetzten Programm.
Da partielle Auswertung automatisch ausgeführt wird, ergeben sich stets korrekte Zielprogramme betreffs der Spezifikation int :
out = [| source |]S input (1)
= [| int |] [source,input] (2)
= [| [|mix|] [int,source] |] input (3)
= [|target |]L input (4)
Die Gleichung target = [|mix|] [int source] wird die 'erste Futamuraprojektion' genannt.

Ebensogut kann man durch parallele Betrachtung das Parsen eines Strings in zwei Stufen durch partielle Auswertung durchführen. Dazu spezialisiert man einen allgemeinen Parser auf eine bestimmte Grammatik.


6.1 Traditionelles Compiling und partielle Auswertung

Nun kann man sich die Frage stellen, ob es noch notwendig ist, Compiler per Hand zu schreiben.
Für die Übersetzung mit partieller Auswertung spricht, daß die erzeugten Programme stets korrekt im Hinblick auf die Spezifikation int sind. Weiterhin wird die Programmausführung beschleunigt, da viele Interpreterberechnungen nur vom Quellprogramm abhängen und so vorausberechnet werden können.
Dagegen spricht, daß der erzeugte Code stets in der Ausgabesprache eines partiellen Auswerters ist, d.h. es werden keine neuen Datenstrukturen 'erfunden', die die Laufzeit oder den Platzbedarf des erzeugten Programms weiter verbessern könnten. 'Normale' Codeoptimierungen sind im Modell des partiellen Auswerters nicht enthalten, da sie oft von speziellen Maschinenmodellen abhängen und schwer zu verallgemeinern sind. Da partielle Auswertung automatisch erfolgt und daher nicht kreativ sein kann, wird der erzeugte Code nicht so gut wie Handgeschriebener sein. Für Prototypenerzeugung ist partielle Auswertung jedoch bestens geeignet, da keine Fehler 'gemacht' werden können.