JavaScript でプリエンプティブなスレッドを
先日の RHG 読書会で、牧さんがやっているという http://sourceforge.net/projects/jsthread/ の紹介があった。 JavaScript でプリエンプティブなスレッドをライブラリレベルで実装した、という話。
JavaScript というのは、ユーザレベルからはスレッドが一本しかなくて、処理の切り替えというのができない。だから、タイムアウト呼出や処理の終了のイベントを待って終了処理をする、ってなことを書かないとまともなプログラムを書けない。でもこれは大変だ。
この Concurrent.Thread を使って関数を渡すと、そのプログラムが呼び出し元と並列に走る。ように見える。なのであまり気にせずループみたいなものを回す関数を使ってもブラウザが停止したりしない。
まだドキュメントとかはないのだけれど、昨日ちらっと見たサンプルコードから、いいかげんにデッチ上げてみたら、それっぽく動くようだ→http://www.city5.org/fib.html これはフィボナッチ数を順番に表示するというプログラムだけど、メイン部分は while(true) で回している。 Concurrent.Thread を使わないと、 JavaScript が暴走してエライことになる。
ついでに arton さんのライフゲームのやつも同じ調子で書き直してみた→http://www.city5.org/life.html
なんとなーくわかったけど、まだよくわからんところもあっていいかげんです。ドキュメント欲しい(笑)。
ところで、これはいったいどうやっているのか、というと、関数が Thread.create に渡されると、それを文字列化してパースし、かたまって動くものを細切れに動くようにコード変換するらしい。オーバヘッドが気になるのだけど、正直なところそれほどの問題はなさそうに見える。ちなみにコード変換はまだ完璧ではないらしく、一部の構文がまだ動かないと昨日は言っていたのだけど、このフィボナッチ数でもちょっとハマった。 n1 や n2 はスレッドのスコープにあるのが見てわかると思うけれど、これを main のスコープにすると動かなくなるのだ。って書くと、そういえばそんなことを言っていたような記憶も……。ふうーむ。
いやでも、これは面白いなあ。