Fortsetzung-Passing Style

Unter Continuation-Passing – Art (kurz CPS ) Versteht man EINEN Programmierstil, bei ihnen gibt Kontrollfluss Ausschließlich Durch FORTSETZUNG gesteuert Wird. Fortsetzung Mind Die Funktion, die die Abhilfemaßnahmen neu zuweist. Die Programme des Continuation-Passing Style der vorliegenden Fortsetzung.

In den programmierten Programmen wurde das Programm vom Functional Manager und vom Control Panel auf den Aufrufer zurückgegeben. Zur Abgrenzung von CPS wird dies als Direction Stil, direct style , bezeichnet. Es ist aber Auch Möglich, wo Funktion Eine Nachfolgefunktion zu übergeben, sterben eine Stelle des Aufrufers das Plan Ergebnis erhalten soll. Anstatt zum Aufrufer zurückzukehren, übergibt die Funktion ihr Ergebnis dieser Nachfolgefunktion. Die Funktionen afbeelding gewissermaßen eine Kette. Statt von Einer Nachfolgefunktion Kann man auch von Einem „Fortführung“ sprechen, jenes deutsches Wort für Fortsetzung . Dort ist CPS einer der Programmstile, denen diese Vorgehensweise folgt.

CPS macht die in vielen Sprachen Notwendig Stapel zur Speicherung der Rücksprungadresse beim Aufruf Einer Methode Überfluß. DAMIT ist es Möglich, Eine Programmiersprache ohne Stack ( Stackless ) zu implementieren. Wenn auf vielen Systemen sterben Größe des Stacks Begrenzt ist, ist ohne CPS Auch sterben Maximale Rekursionstiefe Begrenzt wurde unter umständen zum Problem Werden Kann. Mein CPS ist es möglich, diese Begrenzung zu umgehen. Ein Beispiel dafür ist Stackless Python .

Viele Compiler logisch und funktional Programmiersprachen Verwenden CPS als interne Repräsentation Ein Programm, dann es erleichtert, Schluss über das Programm zu Zieher und DAMIT Optimierung Vereinfacht.

Ein direkter Stil -Sprache Wie JavaScript in CPS zu transformieren, Führt dazu (soferne wo Compiler keine Endaufruf Optimierung Unterstützt), Dass früher oder später der Stapel überläuft wenn Ein Aufruf Wacholder Fortsetzung verlassene Funktion nicht über Empfehlung : Ihr „offiziellen“ Weg durch Beten Wird und SOMIT wo Stackeintrag nicht abgeräumt Wird. If Ausnahmen verfügbar Sind, ist es aber Möglich, beim erreichar Wacholder Bestimmt Rekursionstiefe sterben aktuelle Fortsetzung in Eine Ausnahme zu Paket und this zu werfen. Das wickelt der Stack ab und am Ende der Oberen Kette von Funktionsaufrufen wartet ein Exception, wo verpackte Fortsetzung aufruft sterben. Auf this Weise implementiert beispielsweise Flapjax eine CPS-Transformation von JavaScript-Code.

Beispiel

Die folgende JavaScript- Funktion berechnet die Fakultät Ihrer Argumente. Der Recruiter Recruiter wird dabei weiterverwendt:

Funktion fakultaet ( n ) {
 wenn ( n === 0 ) return 1 ;
 Rückkehr n * Fakultät ( n - 1 );
}

Diese Fortführung kann auch durch eine Funktion übernommen werden

Funktion fakultaet_cps ( n , k ) {
 wenn ( n === 0 ) return k ( 1 );
 return fakultaet_cps (
 n - 1 ,
 Funktion ( Zwischenergebnis ) {
 return k ( n * zwischenergebnis );
 });
}

Zur Auswertung wo Fakultätsfunktion übergibt man ihr als Fortsetzung sterben Identitätsfunktion :

Funktion Identität ( x ) { return x ; }
fakultaet_cps ( 5 , Identität ); // ergibt 120

Die Funktion könnte auch in einer Umgebung sein, in der ihr Ergebnis oder verdoppelt werden soll:

2 * Fakultät ( 5 )

Im CPS wird das die Fortsetzung:

fakultaet_cps ( 5 , Funktion ( x ) { Rückkehr 2 * x ; })

Literatur

  • Daniel P. Friedmann, Mitchell Wall: Grundlagen der Programmiersprachen . The MIT Press, 2008, ISBN 0-262-06279-8 .