JavaScript で Actor風Future通信


JavaScript を使って Actor 理論風の Future を作ってみました.Actor の生成は実装せずに関数で代用しています.実行時ライブラリに future と reply それぞれについて平均 0.5 秒の遅延を入れたので,ものすごく遅いです.以下の例の fact(4) の計算には約5秒がかかります.これは使用している future と reply の数が合計で約10個ということになります.fact(4) は再帰的に fact(3), fact(2), …, fact(0) を呼びますので,最初の fact(4) を future で呼び出すのも含めて5回の future が実行され,それぞれが一回ずつ reply するため合計で10回の通信が発生しますので,計算時間と一致します.

 install('fact',
   function (n, reply) {
     if (n == 0) reply(1);
     else
       future('fact', n - 1,
         function (f) { future('multiply', n, f, reply); });
   });

 install('multiply',
   function (x, y, reply) { reply(x * y); });

 future('fact', 4, alert);

実装に興味がある人はgithubを見て下さい.100行足らずの JavaScript のコード(messaging.js)です.

やたらに面倒なコードだと思われるかもしれませんが,Safari Extention のサンドボックス機構におけるメッセージングに応用しようとしています.Safari Extention API よりははるかに単純な機構になる予定です.乞うご期待.