「ワールドを使った計算」に対して、id:squeakerさん(改訂版論文の著者のお一人です!)から「もっと新しい論文があるよ」と教えていただきました。
- Title: Worlds: Controlling the Scope of Side Effects (2010)
- Authors: Alessandro Warth, Yoshiki Ohshima, Ted Kaehler, and Alan Kay
- Pages: 12ページ (表紙除く)
- URL: http://www.vpri.org/pdf/tr2010001_worlds.pdf
ベージ数は2008年版と大差ないですが、2段組で情報はずっと増えています。説明が詳しくなったので、2008年版で不明だった所もだいぶ分かるようになっています。「ワールドを使った計算」に僕が書いていた疑問点を引用すると:
- 継続渡しと変わんない気もするのですが、僕の気のせいかしら。
- ワールドに“本物の世界”をどこまで詰め込めるのか?
- 複数のワールドのcommit間でのコンフリクトの問題はないのか?
- ワールドの定式化はどういう計算モデルなんだろう?
「ある時点における実行環境のスナップショット」と言ってしまうと、継続もワールドも同じように思えるのですが、「何をキャプチャーするか」において継続とワールドは違います。継続は制御構造を意図しているので、レジスタやスタックを記録します。一方のワールドは制御とは無関係で、オブジェクト状態をキャプチャーするので、ヒープを記録します。ほんとに丸々コピーしたりはしませんが、キャプチャーする対象物と目的はそんな感じ。
Worlds/JSやWorlds/Squeakにおけるワールドはメモリ内のオブジェクト状態です。ファイルシステムやデータベースのような外部ストレージまでは(現状では)対象になってないようです。
ワールドの一貫性(consistency)を維持するメカニズムが備わっていて、commitのときに一貫性を破壊しないかどうかのチェックが行われるようです。
JavaScriptオブジェクトのプロパティアクセスに関しては、厳密な定式化(形式的な記述)が載っています。JavaScriptにおける実行環境は、オブジェクト達のプロパティの値で尽きているので、これで十分でしょう。
という次第で、疑問な点も2010年版の論文でだいたい解消しました。ワールド(worlds)という発想は色々と参考にはなりますが、CatyScriptのアンビエントのように、外部ストレージ操作のトランザクションを主たる目的とするサンドボックス実行(sandboxing)とは違いもあります。“実行環境”とは何であるか? という問題はもっと考えてみる必要がありますね。考えが多少まとまったら「続々・ワールドを使った計算」を書くかも。