Continuation Fest 2008に行ってきました

Continuation Fest 2008 に行ってきました。
会場には早めについた。入り口のところでささださんに「来るとは思わなかった」と言われる(ぉ。
アカデミックな感じでアウェー感がただよってる(笑)。


所属を書いたネームプレートは大学ばかりだ。胸を張ってサイボウズ・ラボと書いてきたよ。
しばらくしたら同僚の光成さんが来た。id:yumm3さんも来た。

継続を使った printf の型付け by 浅井健一さん

英語が聞き取りやすい。心配した英語も話の難易度もぎりぎりどうにかなりそう。
コードが OCaml だ。

times

リストの積を返す再帰手続き。途中で 0 が出てきたらすぐに 0 を返したい。

  • 例外 raise Zero を使う方法を思いつくけど
    • でも例外メカニズムが必要だ。
  • CPS にして Continuation を引数にすればいいよね。
    • 普通にやると再帰で Continuation が大きくなる。これは普通に再帰した場合にはシステムスタックにつまれていた情報だ。
    • これを 0 の要素を見つけたら Continuation を 0 にしてやればすぐに中断できる。継続を破棄してやれば良い。
    • 例外のメカニズムは要らないよね。
    • でもこれはすべてのプログラムをCPS で書かないといけないことを意味する。
    • 本当はやりたいときだけこういうスタイルで書きたい。

shift: captures the current continuation(up to reset)
rest: installs the empty continuation

Delimited continuation (call/cc と違いキャプチャするのはリセットまで。)

  • 継続を使いたいときだけ shift/reset を使えば良い、それ以外は自然な方法で記述できる。
printf

sprintf(% str ++ lit " is " ++ % int) "t" 3
type-safe な printf を書くという話。
理解6割。

Continuation をくるんだ手続きを返すってのが面白い。(このテクニックどこかで見たことあるなあ)
OCaml ってマクロ的なものあるんだね。

サマリーの「全部 CPS で書けば shift/reset いらなくね?どうなの?」な話が面白かった。
あと shift/reset は call/cc があれば Scheme でも実装できるらしい。

ネストしたWeb トランザクションのための永続的限定継続のデモ by Oleg Kielyov

CGI をアプリケーションコンソールアプリケーションのように書けるというデモ。
ダイアログで質問を出してみたいな流れでウェブアプリケーションを書きたい。


プロセスが停止したり再開するのも Continuation だ。これは TTY アプリケーションで read-line したときに起こっていること。
fork は resume を2回しているのと同じ。
Web アプリケーションでも OS をエミュレートすれば似たようなことが出来る。shift を使う。
継続をファイルに保存すればステートレスな CGI でもつかえる。そうすることでセッションのようなことができるし。いつでも好きな場所に戻れる。

delimited continuation のメリット

キャプチャの範囲が限られるので

  • makes them small
  • makes them possible
  • makes them correct

らしい。small は分かるが他のは聞き取れなかった。

Persistent delimited continuation は CGI プログラミングと相性が良いという結論。
質問タイムの Continuation のシリアライズについての話が面白かった。
PLT Scheme は delimited continuation を実装しているらしい。
英語が厳しかった。

Kahua における継続のさまざまな使い方 by 伊東勝利さん

Arc からの挑戦のサンプルから。継続ベースで簡単に書けるよと。
でもページ生成そのものを継続にするとページの一部をどうにかするのが難しい?
parts-cont キーワードで HTML ノード毎に継続を定義できるらしい。
中身の仕組みが見えないな今度コードを読んでみよう。

日本語の文法に置ける限定継続 by 大竹塁さん

すみません。よく分かりませんでした。(集中力が一度切れてしまった。)

ビデオのデコードとスクラビングのための継続 by Conrad Parker

エンコードされたビデオのプレイバックについて。
ビデオプレイヤーのバッファリングとデコードって大変なんだなあ。

  • seek と scrub について
    • Frame について next, prev frame , seek to frame # などを実現したい
    • TOCが必要だ
    • ビデオファイルは大きい
    • 圧縮されている
    • decode はCPU を使う
    • デコード済みのフレームは大きい
  • AudioとVideo の sync
  • デコードにコルーチンを使うのは有効だ

あれ?結論はデコードは状態遷移があるしデバッグが大変なのでおそらく continuation-base なものが良いに違いないだって。

過去からの継続 by 渡部卓雄さん、田中祐一さん

  • call/ppc
    • call with placed partial continuation
    • 一番内側の delmiter までの continuation をキャプチャし、指定した場所に保存する


プログラムを停止も再起動もせずにアップグレードする。
アップグレード「コードの一部を入れ替える」
どうやって今のコードの状態を、アップグレードしたプログラムに引き継げば良いのだろう?

アップグレードのシナリオ

  • たし算 Web アプリを掛け算ウェブアプリにする( + => * にする)
    • ユーザの入力を1つ受け付けた状態でつまり途中の状態でアップグレードする
  • Continuation を使って状態を得る
    • input form は continuation に保持される
    • アップグレードが起きたら初期状態に continuation tree を適用する
  • Kahua を使って田中さんによって実装されたらしい
  • 簡単なパターンでしか適用できないかも。

gcc 4.x を使った「継続オンリーな言語」 by 河野真治さん

お!。思い出した継続のことが分からないときに検索したらよくこの方の論文が検索で引っかかっていたな。
sf.jp/projcecs/cbc

話に夢中でメモとる暇なかった。面白いすぎるwww
tail call elimination とかあらかじめ理解できてて良かった。
function call はもう古い。
Power PC のリンクレジスタあとで調べる。

Ruby における Continuation

東京大学秋葉原キャンパスは良かったよ。
callcc を実装している一番大きな理由に笑った。criminal

Ruby 1.9 の native thread は並行に動かせない。thread unsafe な C 関数があるから。

個人的な収穫

  • 勇気を出してアカデミックっぽいところに行ってみた
    • 理解できるもの「も」あることが分かった
  • Delimited continuation を知った
    • 浅井健一さんの説明がとても分かりやすく面白かった
  • 家に帰ってから伊東さんが cut_sea さんだと気づく。挨拶すれば良かった。。orz
  • id:lethevert さんもいらっしゃった様子。

追記

もしも Continuation Fest の感想記事等ありましたらトラックバックとか頂けるとうれしいです。
理解出来なかったところが分かるかもしれないので。