Tokuda Lab. NISHIMURA Taichi

Slides:



Advertisements
Similar presentations
セッション管理 ソフトウェア特論 第 8 回. ここでの内容 セッション管理の基本を知る。 HttpSession の使い方を知る。
Advertisements

コンパイラ演習 第 6 回 2005/11/17 大山 恵弘 佐藤 秀明. 今回の内容 実マシンコード生成 – アセンブリ生成 (emit.ml) – スタブ、ライブラリとのリンク 末尾呼び出し最適化 – 関数呼び出しからの効率的なリターン (emit.ml) –[ 参考 ]CPS 変換 種々の簡単な拡張.
コンパイラ演習 第 6 回 (2011/11/17) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
(Rubyistのための) 超音速:ML入門
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
プログラミング言語論 第8回 LISP 担当:犬塚.
プログラミング言語論 関数型プログラミング言語 水野嘉明
2006/11/9 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ 2011年11月14日
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 M2 平石 拓
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
プログラミング言語としてのR 情報知能学科 白井 英俊.
ISD実習E 2009年7月13日 LISPシステム入門 (第6回) 関数の定義 eval load 関数.
クラスその2∽(アドバンス)∽ 福岡工業大学  梶原 大慈       .
プログラミングパラダイム さまざまな計算のモデルにもとづく、 プログラミングの方法論 手続き型 関数型 オブジェクト指向 代数 幾何.
データ構造とアルゴリズム 第10回 mallocとfree
最適化ソルバーのための Python言語入門
2006/12/7 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
条件式 (Conditional Expressions)
セッション管理 J2EE I 第9回 /
米澤研究室 全体ミーティング 2010/12/22 M2 渡邊裕貴.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
関数 関数とスタック.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
Javaによる Webアプリケーション入門 第9回
二分探索木によるサーチ.
第8章 Web技術とセキュリティ   岡本 好未.
2004年度 サマースクール in 稚内 JavaによるWebアプリケーション入門
2003年度 データベース論 安藤 友晴.
コンパイラの解析 (4) 例外処理.
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
PROGRAMMING IN HASKELL
東京工科大学 コンピュータサイエンス学部 亀田弘之
関数の定義.
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 D1 平石 拓 2005/10/18
6. リスト処理関数の設計(発展版) プログラミング論 I.
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
6.リストの生成.
依存型で型付けされた 副作用のある関数のための 型保存コンパイラ
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
4.リスト,シンボル,文字列.
オブジェクト指向プログラミングと開発環境
11.再帰と繰り返しの回数.
15.cons と種々のデータ構造.
データ構造とアルゴリズム 第11回 リスト構造(1)
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
アルゴリズムとデータ構造 2013年7月1日
PROGRAMMING IN HASKELL
執筆者:難波和明 授業者:寺尾 敦 atsushi [at] si.aoyama.ac.jp
プログラミング言語論 第10回 情報工学科 篠埜 功.
アルゴリズムとデータ構造1 2009年6月15日
5. 任意長の合成データ:リスト プログラミング論I.
PROGRAMMING IN HASKELL
関数型言語の基礎 型なしl計算 型理論 構成的プログラミング GUIにあらわれる関数概念 PBD VL
アルゴリズムとデータ構造 2010年6月17日
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
プログラミング演習I 2003年6月11日(第9回) 木村巌.
7. 設計の抽象化 プログラミング論 I.
第10回 関数と再帰.
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
プログラミング言語論 プログラミング言語論 演習7 解答と解説 演習7 解答と解説 1.
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
Presentation transcript:

Tokuda Lab. NISHIMURA Taichi 継続とWebアプリケーション Tokuda Lab. NISHIMURA Taichi

目次 継続とは何か 継続の応用 継続とWebアプリケーション

継続(Continuation)とは 現在の処理を続行するための情報 広義ではC言語の関数の戻りアドレスも継続の一種 setjmp/longjmpのjmp_buf 演算レジスタ プログラムカウンタ スタックポインタ etc

狭義の継続 Schemeにおける継続はCのlongjmpよりもずっと強力 続行後の処理そのものを継続という事も多い ファーストクラスのクロージャによって環境を閉じ込められる 当然スタックに依存しない 続行後の処理そのものを継続という事も多い Scheme(R5RS)の定義 「Schemeの式が評価される時、そこには評価の結果を待つ継続が一つ待機している。継続は計算の(デフォルトの)未来全体を表している」

CPSとは CPS: Continuation Passing Style (継続渡し形式) 「プログラムの残りの計算」を引数に取る関数を作る形式 この引数がすなわち「継続」 任意の再帰関数はCPSに変換できる CPSは末尾再帰 CPS変換によって継続が明示的になる 関数呼び出しが一続きの鎖になる

CPS変換の例 末尾再帰になっている cont(残りの計算=継続)に identityを与えればfactと等価 (define (fact n) (if (= n 0) 1 (* n (fact (- n 1))))) (define (fact/cps n cont) (cont 1) (fact/cps (- n 1) (lambda (a) (cont (* n a)))))) cont(残りの計算=継続)に identityを与えればfactと等価    末尾再帰になっている

継続の保存 (define (match data pred cont) (cond ((null? data) (cont #f #f)) ((pred (car data)) (cont (car data) (lambda () (match (cdr data) pred cont)))) (else (match (cdr data) pred cont)))) (define (find-odd data) (match data odd? (lambda (found cont) (if found (begin (format #t "found:~s~%" found) (cont)) (format #t "end.~%"))))) (find-odd '(0 1 2 3 4 5))

継続の保存 1つずつ解を取り出すことができる (define next #f) (define (find-odd-1 data) (match data odd? (lambda (found cont) (if found (begin (format #t "found:~s~%" found) (set! next cont)) (begin (format #t "end.~%") #f))))) gosh> (find-odd-1 '(0 1 2 3 4 5)) found:1 #<closure (match #f)> gosh> (next) found:3 1つずつ解を取り出すことができる

明示的に継続を生成する Schemeではcall/cc、あるいはcall-with-current-continuationを使う > (+ (* 1 2) (call/cc (lambda (c) (* 3 4)))) 14 > (+ (* 1 2) (call/cc (lambda (c) (* 3 (c 4))))) 6 > (define cont #f) > (+ (* 1 2) (call/cc (lambda (c) (set! cont c) (* 3 4)))) > (cont 2) 4 > (cont 5) 7

明示的に継続を生成する例 リストの2つ目の要素は contに与えられた値がそのまま返る x=0という束縛は > (define x 0) > (define y 2) > (define cont #f) > (list x (call/cc (lambda (c) (set! cont c) 1)) y) (0 1 2) > (cont 3) (0 3 2) > (set! x 4) > (set! y 6) (0 3 6) リストの2つ目の要素は contに与えられた値がそのまま返る x=0という束縛は 継続contに含まれているので変化なし yの値は新しく読み出すので変化する

継続の応用例(大域脱出) リストの要素の合計を返す ただし、 数値以外が含まれていた場合は その要素を返す (define (sumup x) (call/cc (lambda (cont) (letrec ((sum-aux (lambda (y) (cond ((null? y) 0) ((not (number? (car y))) (cont (car y))) (#t (+ (car y) (sum-aux (cdr y)))))))) (sum-aux x)))))   > (sumup '(1 33 4 0 3 7))   48   > (sumup '(1 0 -1 a 7))   a リストの要素の合計を返す ただし、 数値以外が含まれていた場合は その要素を返す

継続の応用 大域脱出は便利 でもそれだけではない 例外処理とほぼ同じ 唯一のまともな継続の応用 longjmpも例外処理とほぼ同じ 継続のサンプルコードは大域脱出がほとんど でもそれだけではない

Webアプリケーション 一般的に、ページ毎にプロセス生成 ステートレスなので状態を保つのは大変 セッションから状態を復帰 セッションに状態を保存 Cookie、hiddenフィールド 「戻る」ボタンの存在

継続サーバの Webアプリケーション 各リクエストの処理後に継続をキャプチャ 次のリクエストの処理前に継続に復帰 IDを付けてセッションに保存 次のリクエストの処理前に継続に復帰 ステートフルだから自然なプログラムが書ける 欠点 重い 部分的継続によってある程度は解決可能 ユーザが慣れるのに時間がかかるかも

継続サーバの例 Kahua(Scheme) Seaside(Smalltalk) Iowa,Wee(Ruby) Continuty(Perl)