Continuation

在電腦科學和程式設計中，**計算續體**或簡稱**續體**（英語：**continuation**，也譯作續延、延續性），是對電腦程式的控制狀態的一種抽象表現。續體實化了程式狀態資訊。可以理解為，一個續體以資料結構的形式表現了程式在執行過程中某一點的計算狀態，相應的資料內容可以被程式語言存取，而不是被執行時環境所隱藏掉。這對實現程式語言的某些控制機制，比如例外處理、協程、生成器非常有用。

續體包含了當前程式的棧（包括當前周期內的所有資料，也就是局部變數），以及當前執行的位置。一個續體的實例可以在將來用在控制流上，被呼叫時它從所表達的狀態開始恢復執行。

## 頭等續體

頭等續體對一門語言而言是能完全控制指令執行次序的能力。它們可以用來跳轉到產生對當前函式呼叫的那個函式，或者跳轉到此前已經登出了的函式。人們可以認為頭等續體儲存了程式執行狀態，注意到真正的頭等續體不同於行程映像是很重要的，它不儲存程式資料，只儲存執行上下文。這經常採用「續體三明治」譬喻來說明：

> 
> 假想你正站在廚房冰箱之前，想要一個三明治。你就在這裡將一個續體放入口袋裡。接著在從冰箱裡拿出火雞肉和麵包自己做了一個三明治，然後坐到桌案前。你啟用了口袋裡的續體，這時發現自己再次站到了冰箱之前，想要一個三明治。幸運的是，在桌案上就有一個三明治，而用於做三明治的材料都沒有了。你可以吃三明治了。
> 
> 

在這個譬喻中，三明治是一部份程式資料（比如在分配堆上一個物件），並非去呼叫「製做三明治」常式並等它返回，這裡呼叫「以當前續體製做三明治」常式，它建立一個三明治並在儲存續體的已脫離執行的地方繼續執行。

Scheme 是支援續體的第一個完全的生產系統，它最初提供了源自 Maclisp 的命名的 `catch/throw`，後來提供了 `call/cc`。Bruce Duba 將 `callcc/throw` 介入到了 SML/NJ。

續體還被用於計算模型，包括指稱語意、演員模型、行程演算和 lambda 演算。這些模型依賴於編程者或語意工程師以所謂的續體傳遞風格書寫數學函式。這意味著每個函式都消費表示與這個函式呼叫有關的餘下計算的一個函式。要返回一個值，這個函式以一個返回值呼叫這個續體函式，來中止這個返回一個值的計算。

以續體傳遞風格書寫程式的函式語言程式設計者獲得了以任意方式操縱控制流程的表達能力。代價是他們必須手工維護控制和續體的不變數，這通常是高度複雜的任務。

### 用例

Scheme 程式語言包括了控制算子 call-with-current-continuation（簡寫為 `call/cc`），Scheme 程式可以通過它操縱控制流程：

下面使用上述定義的函式 `test`，它設定 `the-continuation` 為自身的將來執行狀態：

#### 協程

Scheme 實現協程是很輕易的，只需維護一個續體的佇列。下面是使用續體將協程實現為獨立執行緒的用例：

上述定義的函式允許通過協同運作多工定義和執行執行緒，執行緒 `yield` 控制權給佇列中下一個執行緒：

上述代碼不停的產生如下這樣的輸出：

### 程式語言支援

很多程式語言以各種名義體現出頭等續體，特別是：

在支援閉包和正當尾遞迴的任何程式語言中，都可能以續體傳遞風格書寫程式並手工實現 `call/cc`。 在續體傳遞風格下，`call/cc` 成為了可以用 lambda 書寫的一個簡單函式。需要支援正當的尾遞迴，因為在續體傳遞風格下沒有函式會返回，所有呼叫都是尾呼叫。

## 參照

## 延伸閱讀

* Peter Landin. _A Generalization of Jumps and Labels_ Report. UNIVAC Systems Programming Research. August 1965. Reprinted in Higher Order and Symbolic Computation, 11(2):125-143, 1998, with a foreword by Hayo Thielecke.
* Drew McDermott and Gerald Sussman. _The Conniver Reference Manual_ MIT AI Memo 259. May 1972.
* Daniel Bobrow: _A Model for Control Structures for Artificial Intelligence Programming Languages_ IJCAI 1973.
* Carl Hewitt, Peter Bishop and Richard Steiger. _A Universal Modular Actor Formalism for Artificial Intelligence_ IJCAI 1973.
* Christopher Strachey and Christopher P. Wadsworth. _Continuations: a Mathematical semantics for handling full jumps_ Technical Monograph PRG-11. Oxford University Computing Laboratory. January 1974. Reprinted in Higher Order and Symbolic Computation, 13(1/2):135—152, 2000, with a foreword by Christopher P. Wadsworth.
* John C. Reynolds. _Definitional Interpreters for Higher-Order Programming Languages_ Proceedings of 25th ACM National Conference, pp. 717–740, 1972. Reprinted in Higher-Order and Symbolic Computation 11(4):363-397, 1998, with a foreword.
* John C. Reynolds. _On the Relation between Direct and Continuation Semantics_ Proceedings of Second Colloquium on Automata, Languages, and Programming. LNCS Vol. 14, pp. 141–156, 1974.
* Reynolds, John C. The discoveries of continuations (PDF). Lisp and Symbolic Computation. 1993, **6** (3/4): 233–248 [2021-10-11]. （原始內容存檔 (PDF) 於 2022-03-20）.
* Gerald Sussman and Guy Steele. _SCHEME: An Interpreter for Extended Lambda Calculus_ AI Memo 349, MIT Artificial Intelligence Laboratory, Cambridge, Massachusetts, December 1975. Reprinted in Higher-Order and Symbolic Computation 11(4):405-439, 1998, with a foreword.
* Robert Hieb, R. Kent Dybvig, Carl Bruggeman. _Representing Control in the Presence of First-Class Continuations_ Proceedings of the ACM SIGPLAN '90 Conference on Programming Language Design and Implementation, pp. 66–77.
* Will Clinger, Anne Hartheimer, Eric Ost. _Implementation Strategies for Continuations_ Proceedings of the 1988 ACM conference on LISP and Functional Programming, pp. 124–131, 1988. Journal version: Higher-Order and Symbolic Computation, 12(1):7-45, 1999.
* Christian Queinnec. _Inverting back the inversion of control or, Continuations versus page-centric programming_ SIGPLAN Notices 38(2), pp. 57–64, 2003.

## 外部連結

* ACM SIGPLAN Workshop on Continuations 2011 （頁面存檔備份，存於網際網路檔案館） at the ICFP.
* Continuations for Curmudgeons （頁面存檔備份，存於網際網路檔案館） by Sam Ruby
* Teach Yourself Scheme in Fixnum Days by Dorai Sitaram features a nice chapter on continuations.
* Continuations and Stackless Python （頁面存檔備份，存於網際網路檔案館） by Christian Tismer
* On-line proceedings of the Fourth ACM SIGPLAN Workshop on Continuations （頁面存檔備份，存於網際網路檔案館）
* On-line proceedings of the Second ACM SIGPLAN Workshop on Continuations
* Continuation, functions and jumps （頁面存檔備份，存於網際網路檔案館）
* http://okmij.org/ftp/continuations/ （頁面存檔備份，存於網際網路檔案館） by Oleg Kiselyov
* https://wiki.haskell.org/Continuations
* Rhino With Continuations
* Continuations in pure Java from the RIFE web application framework
* Debugging continuations in pure Java （頁面存檔備份，存於網際網路檔案館） from the RIFE web application framework
* Comparison of generators, coroutines, and continuations, source of the above example （頁面存檔備份，存於網際網路檔案館）