Continuations als Sprachmittel

Eine zentrale Hürde bei der Entwicklung moderner Webapplikationen ist die Zustandslosigkeit von HTTP. Ein seit einiger Zeit stark diskutierter Lösungsansatz hierfür ist die Verwendung eines Framework auf Basis von Continuations.

vorlesen Druckansicht
Lesezeit: 14 Min.
Von
  • Frank Müller
  • Jürgen Seeger
Inhaltsverzeichnis

Continuations sind einer der derzeit viel diskutierten Ansätze, um die Zustandslosigkeit von HTTP in der Programmierung zu umschiffen. Dass dieses Sprachmittel aus einer Zeit weit vor dem Web stammt, ist vielen Beteiligten unbekannt. Dabei könnte die Kenntnis der Geschichte dieses Ansatzes den Blick für dessen Stärken und Schwächen schärfen.

Eingeführt wurde der Begriff Continuation bereits in den 60er-Jahren von Christopher Strachey, Christoper P. Wadsworth und John Reynolds. Das erste Web-Framework, das Continuations für den Kontrollfluss nutzte, war Seaside. Diese in Smalltalk entwickelte Bibliothek [1] verzichtet auf ein aufwendiges, in XML oder in anderer Form definiertes Mapping von URLs zu Komponenten. Stattdessen erzeugen Seaside-Komponenten ihre individuelle Ausgabe programmatisch durch die Methode renderContentOn:. Sie erhält als Argument ein HTML-Render-Objekt, das über Methoden zur Erzeugung der HTML-Ausgabe verfügt. Die Methoden für die Erzeugung von Links erhalten als Callback unter anderem einen Block, auch als Closure bekannt, für den nach einer Auswahl auszuführenden Code.

Zur Darstellung dieses Links generiert Seaside eine individuelle ID, die gemeinsam mit der Session-ID Teil der URL ist. Gleichzeitig wird der übergebene Callback-Block in einem Dictionary gesichert und steht dadurch bei einer erneuten Auswahl des Links wieder zur Verfügung. So kann der Programmfluss in einfachster Form fortgesetzt werden, sowohl in der aktuellen Komponente als auch beim Start einer neuen.

Blöcke lassen sich zwar wunderbar für eine spätere Ausführung speichern. Doch die erfolgt immer in einem Kontext, der sowohl alle lokalen Variablen im Sichtbereich des Blocks als auch die Aufrufkette, die zur Aktivierung der Methode führte, umfasst. Mit dem Verlassen der Methode, in der der Block definiert ist, verändert sich dessen Kontext. Das Ergebnis einer späteren Blockausführung auf Basis einer Benutzerinteraktion ist dann kaum vorhersehbar.

An eben dieser Stelle setzen Continuations an. Wie der Name bereits andeutet, handelt es sich um eine Technik zur Fortsetzung eines Programms an einer definierten Position. Dabei geht es nicht nur um einen einfachen Sprungbefehl, sondern um ein Konstrukt zur Sicherung des aktuellen Kontexts, zu dessen Übermittlung für eine Weiterverarbeitung an einen Block und zur Terminierung des aktuellen Kontexts mit dem Zweck, das Programm mit dem gesicherten Exemplar fortzusetzen. So ist das nutzende Programm in der Lage, beliebige Punkte in seiner Ausführung als Schnappschuss zu sichern und mittels einer virtuellen Zeitreise an diese Stellen zurückzuspringen.