Imperativ in funktionalen Code übersetzen

10

Ich muss ein Programm schreiben, das imperativen Code in einen reinen funktionalen Stil übersetzt. Ich mache mir keine Sorgen um I / O - ich habe dafür einige Lösungen im Kopf - aber ich muss mich sowohl mit Heap-Objekten als auch mit lokalen Variablen beschäftigen.

Ich nehme an, es könnte geschehen, indem man bei jedem Funktionsaufruf ein TheWorld -Objekt übergibt und von dort aus optimiert und versucht, diesen Parameter aus Funktionen zu entfernen, in denen er nicht verwendet wird usw. Aber es gibt einen besseren Weg Mach es?

    
rwallace 07.07.2011, 05:34
quelle

2 Antworten

5

Es gibt eine Reihe von Möglichkeiten, um eine solche Übersetzung effizient durchzuführen. Zuerst lohnt es sich, eine SSA-Transformation mit einer konsequenten CPS -Transformation durchzuführen: Auf diese Weise erhält man eine Menge Triviales gegenseitig rekursive Funktionen aus einem Imperativcode mit Variablen und Verzweigungen. Funktionsaufrufe (und sogar virtuelle Aufrufe) können auch einfach durch CPS-ed ausgeführt werden, indem statt einer impliziten Stack-Semantik ein Fortsetzungsparameter übergeben wird.

Arrays können wie Variablen behandelt werden, vor einer SSA - Transformation sollte der gesamte Array - Zugriff durch get und update Funktionsaufrufe ersetzt werden, die eine implizite Kopiesemantik haben sollten (aber Vorsicht vor einem Aliasing in dieser Fall). Gleiches für Strukturen.

Und nur in den Fällen, in denen es unmöglich ist, eine Kopiersemantik beizubehalten, muss dieses TheWorld -Objekt vorhanden sein, das alle zugewiesenen Objekte behalten sollte und jedes Mal, wenn Sie eines davon ändern, vollständig kopiert werden sollte.

    
SK-logic 07.07.2011, 10:25
quelle
6

Wie SK-logic darauf hinweist, können Sie Ihr imperatives Programm in SSA-Form darstellen.

Anstatt jedoch die CPS-Transformation anzuwenden, können Sie die imperative SSA-Repräsentation direkt in ein äquivalentes rein funktionales Programm in "Administrative Normal Form" umwandeln - eine eingeschränkte funktionale Sprache, basierend auf dem von Zadarnowski et al / p>

Die zwei Sprachen sind gegeben durch:

Siehe: Eine funktionale Perspektive zu SSA-Optimierungsalgorithmen ", die Algorithmen zur automatischen Übersetzung von Programmen in SSA bietet Form zu ANF.

    
Don Stewart 07.07.2011 18:27
quelle