継続
[Wikipedia|▼Menu]
.mw-parser-output .hatnote{margin:0.5em 0;padding:3px 2em;background-color:transparent;border-bottom:1px solid #a2a9b1;font-size:90%}

この項目では、プログラムの継続について記述しています。「継続」の語義については、ウィクショナリーの「継続」の項目をご覧ください。
.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%;font-size:90%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}html.client-js body.skin-minerva .mw-parser-output .mbox-text-span{margin-left:23px!important}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}

出典は列挙するだけでなく、脚注などを用いてどの記述の情報源であるかを明記してください。記事の信頼性向上にご協力をお願いいたします。(2022年5月)

計算機科学における継続(けいぞく、continuation)とは、プログラムを実行中のある時点において、評価されていない残りのプログラム(the rest of the program)を表現するものであり、手続き(procedure)あるいは関数(function)として表現されるものである[1]

継続に相当する概念は1960年代初頭から存在しており、Algol 60のコンパイラの実装[2]などの文献にたびたび登場していたが、継続の利用に関する最も早い記述は、1964年のアドリアン・ファン・ワインハールデン (en:Adriaan van Wijngaarden) によるものである[1]
概要
計算一般における継続

Schemeによる次の式を考える:(+ 4 (+ 1 2))

この式を評価する際、まず (+ 1 2) が計算され、すなわち 1+2 が計算され、次にその結果に4を足して全体の計算結果が求められる。(+ 1 2) の評価が行われた段階での「残りの計算」を表現すると、(lambda (v) (+ 4 v))

のようになる[3]。この式はすなわち、値 v を引数に取り、それに4を足した値を返す関数である。実際、この後 (+ 1 2) の計算結果が v に代入されて、4を足した値が最終的に計算結果が求められるため、この関数は確かに (+ 1 2) を評価する段階での「残りの計算」の表現である。
call/cc

Schemeの call-with-current-continuation (call/cc と省略される) は、その時点での継続を引数として関数を呼び出す手続きである。Schemeの言語仕様書(R7RS[4])には「もっとも単純な例」として次のコードが載っている:(define list-length (lambda (obj) (call-with-current-continuation (lambda (return) (letrec ((r (lambda (obj) (cond ((null? obj) 0) ((pair? obj) (+ (r (cdr obj)) 1)) (else (return #f)))))) (r obj))))))

このコードは、真正な(終端が空リストである)リストが渡された際にはそのリストの要素数を数えて返し、そうでない場合はfalse値を返す。
goto文を持つ言語の意味論

継続の概念はgoto文を持つ言語に意味論を与える。goto文を持たない場合、意味論は例えば命令文 γ、変数に対する値の割り当て ρ、抽象機械の状態遷移 θ ? [S → S] (S は機械の状態空間を表す) を用いて C [ γ ] ( ρ ) = θ {\displaystyle {\mathcal {C}}[\gamma ](\rho )=\theta } のように与えられる[5][6]。この意味論において、2つの命令の逐次実行は2つの状態遷移の合成として表すことができるが、goto文が存在する言語の場合、goto文の直後の命令は、goto文を実行した直後に実行されるわけではないため、少なくともそのように意味論を与えることはできない。


goto文を持つような言語において、意味論を与える写像 P {\textstyle {\mathcal {P}}} は例えば、命令文の集合 Cmd、環境の集合 Env、継続の集合 C、機械の状態の集合 S を用いて次のような型を持つ: P : [ C m d → [ E n v → [ C → [ S → S ] ] ] ] {\displaystyle {\mathcal {P}}:[{\mathit {Cmd}}\to [{\mathit {Env}}\to [C\to [S\to S]]]]} ここで継続は C = [S → S] すなわち状態の遷移として、また環境 Env は D ⊃ C {\textstyle D\supset C} を満たすようなラベルの集合 D と識別子の集合 Id を用いて Env = [Id → D] と表される。命令文 γ と環境 ρ に対して、 P [ γ ] ρ {\displaystyle {\mathcal {P}}[\gamma ]\rho } は継続を受け取って継続を返す関数の形となる。


この設定の下でgoto文はラベルの識別子 ξ ∈ I d {\textstyle \xi \in {\mathit {Id}}} に対して P [ g o t o ⁡ ξ ] ρ θ σ = ( ρ [ ξ ] 。 C ) σ {\displaystyle {\mathcal {P}}[\mathop {\mathbf {goto} } \xi ]\rho \theta \sigma =(\rho [\xi ]|_{C})\sigma } のように実装される。ここで ρ [ ξ ] 。 C {\textstyle \rho [\xi ]|_{C}} とは ρ [ ξ ] ∈ D {\textstyle \rho [\xi ]\in D} の C への射影であり、動的な型検査としての働きを持つものである[5]
応用
実用
例外的な処理の扱い

たとえばC言語ではsetjmp/longjmpで実装するような、あるいはAdaC++Javaなどの高水準プログラミング言語では言語機能として例外処理をサポートしているが、継続を扱うことができれば、同様の「今やっている計算を打ち切り、ネストの外側に値と処理を返す」、というふるまいをプログラムできる。
Web アプリケーション

Webアプリケーションにおいて、継続の利用が開発効率を上げるとして、継続を利用するスタイルでのWebアプリケーションの開発がおこなえるフレームワークが開発されており、Kahuaなどの実装例がある。


次ページ
記事の検索
おまかせリスト
▼オプションを表示
ブックマーク登録
mixiチェック!
Twitterに投稿
オプション/リンク一覧
話題のニュース
列車運行情報
暇つぶしWikipedia

Size:24 KB
出典: フリー百科事典『ウィキペディア(Wikipedia)
担当:undef