Menu


Microsoft Most Valuable Person

継続渡しスタイル(CPS)再訪、パート4: 自身をひっくり返す

原文

この点で明らかな問題は、以下の通りである:CPSがとてもものすごいならば、それならなぜ、我々が全ての時にそれを使うというわけではないのか?大部分のプロの開発者はなぜそれについてこれまで耳にしなかったのか?あるいは、なぜそれについて耳にした人々はそれを狂ったSchemeプログラマーだけがする何かとみなすのか?

まず第一に、サブルーチン、ループ、try-catch-finallyやその他について考えることに慣れている大部分の人々がこのように制御フローのために使われているデリゲートについて推論することは、単に難しい。私はたった今CS442でのCPSに関する私のメモを見直していて、私は1995年に私が書きとめた教授の言葉を見ている:「継続では、あなたはあなたの頭の上に立って、あなた自身を裏返しに引くようなことをしなければならない」。Duggan教授(*)がそれを言うのは全く正しかった。二日前から、C#の式 M(B()?C():D()) をCPSに変化させた我々のちっちゃな例が4つのラムダを含んだことを思い出しなさい。誰でも、高次関数を使用するコードを読むのが得意であるというわけではない。それは、認識に大きな重荷を強要する。

さらに:言語の中に焼き固められた特定の制御フロー文を持っていることについての親切なもののうちの1つは、呼び出しスタックとリターンアドレスと例外ハンドラー・リストと保護された部分などのメカニズムを隠している間、彼らがあなたのコードに制御フローの意味を明らかに表させたということである。継続は、コードの構築物の中で制御フローのメカニズムを露骨にする。メカニズムの全てのその強調は、コードの意味を圧倒することができる。

また:14文字のコードであったものから4つのラムダが生成されることは、些細でないプログラムのためには、あなたがそれらの全てのクロージャのために結局つくることになるオブジェクトの数が潜在的に巨大なことを意味する。CPSのたくさんの研究は、無数にクロージャをつくることなくCPS変化をもたらす方法を決定することに入った。

それで、普通の人間がCPSプログラムを読み書きするのに困難を持っているならば、なぜ、それは面白いのか?これは単なる知的な練習問題なのか?

それが私にとって興味がある理由は、私が言語の実装側でいるからである。もしもあなたが、あなたの大好きな言語をCPSに一転させるコンパイラを書くことができて、スタックの消費なしで次の継続を送る方法を知っているorchestratorを持っているならば、我々がそれを見たように、あなたは、その言語にあなたが好きなどんな制御フローでもライブラリ呼び出しとして追加するために必要とする全てのビルディングブロックを持っている。プログラムをCPSに変換する重量挙げをコンパイラにさせよう。それから、実行環境に対処させよう;ユーザーは、通常の命令的なスタイルを使用しているプログラムを書くことができる。彼らが新しい種類の制御フローを加えたいならば、彼らはエキゾチックな制御フローのためにライブラリ・メソッドを書くことができる。もちろん、我々は実はそうしない、しかし、技術を理解することは人格形成である。

しかし、それはまだかなりコンピューターサイエンスのようである。言語の使用側で、ビジネス問題を解決する本物を造るためにcall-with-current-continuation機能をいろいろな言語(最近は特にJScript)で使う多くの非アカデミックなプログラマーがますますいる。しかし、これはまだ大部分の主流業務プログラマーの標準にとってはかなりエキゾチックな技術である。

CPSがC#プログラマーに関連する理由は、あなたが多分すでにCPSプログラムを記述する方法を知っているだろうからである;たとえあなたが、それらがそのように呼ばれていることを知らなかったとしても。あなたは、おそらくいくつかのポイントでそれをした。そして、あなたは多分それが混乱させて、エラーを起こしやすくて、難しいとわかっただろう。あなたは、おそらく、非同時性を使ったプログラムを書かなければならなかった。

次の時間:非同時性とCPSは、互いをどうしなければならないか?(ヒント:ほとんどすべて。)

(*) Duggan教授、あなたがこれを読んでいるならば、ねえ、私です。1995年のあなたのCS 442の授業にいた帽子の男です。私がcontinuation passing styleのあなたの説明を理解するためには、私には卒業したあと10年しかかかりませんでした――プログラミング言語機能を設計して、それらのコンパイラを実装する10年でした――。これはあなたの教える能力に何か失敗があったことの反映ではありません。それはすばらしかった。単に、CPSについてあなたの頭を得るのは難しいということです。わかりますか?


インデックスへ戻る


Last Update: 2012-09-26 09:38:52