www.wikidata.de-de.nina.az
Unter Continuation Passing Style kurz CPS versteht man einen Programmierkonzept bei dem der Kontrollfluss ausschliesslich durch Continuations gesteuert wird Continuations sind Funktionen die die verbleibenden Berechnungen reprasentieren An die Stelle der Funktionsruckkehr tritt bei Programmen im Continuation Passing Style der Aufruf der ubergebenen Continuation In den meisten Programmiersprachen werden nach Beendigung einer Funktion ihr Ergebnis und der Kontrollfluss an den Aufrufer zuruckgegeben Zur Abgrenzung von CPS wird dies als direkter Stil direct style bezeichnet Es ist aber auch moglich der Funktion eine Nachfolgefunktion zu ubergeben die an Stelle des Aufrufers das Ergebnis erhalten soll Anstatt zum Aufrufer zuruckzukehren ubergibt die Funktion ihr Ergebnis dieser Nachfolgefunktion Die Funktionen bilden gewissermassen eine Kette Statt von einer Nachfolgefunktion kann man auch von einer Fortfuhrung sprechen dem deutschen Wort fur Continuation Der CPS ist ein Programmierstil der dieser Vorgehensweise folgt CPS macht den in vielen Sprachen notwendigen Stack zur Speicherung der Rucksprungadresse beim Aufruf einer Methode uberflussig Damit ist es moglich eine Programmiersprache ohne Stack stackless zu implementieren Da auf vielen Systemen die Grosse des Stacks begrenzt ist ist ohne CPS auch die maximale Rekursionstiefe begrenzt was unter Umstanden zum Problem werden kann Mit CPS ist es moglich diese Begrenzung zu umgehen Ein Beispiel hierfur ist Stackless Python Viele Compiler logischer und funktionaler Programmiersprachen verwenden CPS als interne Reprasentation eines Programmes da er es erleichtert Schlusse uber das Programm zu ziehen und damit Optimierungen vereinfacht Eine direct style Sprache wie JavaScript in CPS zu transformieren fuhrt sofern der Compiler keine Tail Call Optimization unterstutzt dazu dass fruher oder spater der Stack uberlauft da eine durch Aufruf einer Continuation verlassene Funktion nicht uber ihren offiziellen Weg beendet wird und somit der Stackeintrag nicht abgeraumt wird Wenn Exceptions verfugbar sind ist es aber moglich beim Erreichen einer bestimmten Rekursionstiefe die aktuelle Continuation in eine Exception zu packen und diese zu werfen Das wickelt den Stack ab und am oberen Ende der Kette von Funktionsaufrufen wartet ein Exceptionhandler der die verpackte Continuation aufruft Auf diese Weise implementiert beispielsweise flapjax eine CPS Transformation von JavaScript Code Beispiel BearbeitenDie folgende JavaScript Funktion berechnet die Fakultat ihres Arguments Das Ergebnis des Rekursionsaufrufs wird dabei weiterverwendet Nachfolgend steht ein Aufrufbeispiel function factorial number if number 0 return 1 return number factorial number 1 factorial 5 ergibt 120 Diese Fortfuhrung kann auch durch eine Funktion ubernommen werden die der Fakultatsfunktion ubergeben wird function factorial cps number callback if number 0 return callback 1 return factorial cps number 1 function value return callback number value Zur Auswertung der Fakultatsfunktion ubergibt man ihr als Continuation die Identitatsfunktion function identity number return number factorial cps 5 identity ergibt 120 Die Fakultatsfunktion konnte aber auch in einer Umgebung aufgerufen worden sein in der ihr Ergebnis noch verdoppelt werden soll 2 factorial 5 Im CPS ubernimmt das die Continuation factorial cps 5 function number return 2 number Literatur BearbeitenDaniel P Friedmann Mitchell Wand Essentials of Programming Languages The MIT Press 2008 ISBN 0 262 06279 8 Weblinks Bearbeitenflapjax ein Compiler der JavaScript Code in CPS transformiert Andrew Kennedy Compiling with Continuations Continued PDF 240 kB ICFP 2007 Guy Lewis Steele Jr Debunking the Expensive Procedure Call Myth or Procedure Call Implementations Considered Harmful or Lambda The Ultimate GOTO PDF 951 34 KB MIT AI Lab AI Lab Memo AIM 443 Oktober 1977 Abgerufen von https de wikipedia org w index php title Continuation Passing Style amp oldid 237781320