- Javascriptで無限ループを実現する5つの方法
- http://mono.kmc.gr.jp/~yhara/d/?date=20080114#p02
sleep はまだなさそうだけど、原理的には出来るはず
おお、JSRubyにも言及してくださってありがとうございます。
sleep かあ。やっぱりできると嬉しいのかな。
でも実は今の JSRuby って構文木を再帰的に解釈しながら実行していっているので、今のままだと sleep とか絶対無理なんですよねえ。
これを sleep できるようにするには、少なくとも例えばスタックマシンとかに作り変えなくちゃあならないんですが、そうするとインタプリタのコア部分はすっかり作り直しになるのはもちろん、Rubyのクラスやメソッドの実装回りも残らず全部影響を受けるし、構文木をスタックマシン用の命令列に変換するコンパイラも新しく必要に。
ちょっと今来週締切の仕事を抱えてて、そういう寄り道をしている余裕は全く全然ないんですよねえ。おもしろそうなネタではあるんですけどね。残念。
というわけでちょっとだけ作ってみました。
(output)
非同期に実行されているので、ブラウザの動きをブロックしません。sleepを削ってももちろん大丈夫。
sleep 削っても遅いなあ、とかそんなことはとりあえず気にしない!
1/21 追記:スタックに余計な積み降ろしが発生してしまくっていた(そのたびに setTimeout)のをちょいとなおしました。これだけでもだいぶパフォーマンス改善して sleep 100 の有無で速度に明確に差が出るようになったはず~。
実装は……あまり言いたくないんですが……
なにぶん中谷はいわゆる情報科学をからっきし修めておらず、直感と Wikipedia(笑)だけで実装しちゃうので、これを「スタックマシン」と呼んで怒られやしないか大変不安。他の名前が思いつかないのでとりあえずそう呼ぶことにしますが。
そのスタックマシンに渡される命令列になんと構文木がそのまま積まれてます(えー)。
すなわち実行時に命令列に構文木が見つかったら、必要な範囲だけ展開するという作りになっています。
そのおかげでコンパイラがほとんど不要 & 元の JSRuby の実装も若干再利用が効くので、少ない改変で sleep を実験してみることができました。まあそうはいっても実行時にパッチ当てたりして無理矢理動かしている感じですが……。
この非同期版JSRubyは今のところ実験的という位置付けで、これをどうするかはまあ反響見てからかな、とか思ってます。
[非同期 JSRuby のわかりやすいQ&A!]
Q:えっとえっとじゃあ sleep とか動くんだったら、Thread.new とかもできるようになるの?
A:あー、できるかも。スレッド毎に SMachine インスタンスを生成して、グローバルスコープを共有させて、とりあえずラウンドロビンで回してもいいし、優先順位とかもつけたければつけら……はっっっ! だだだだから来週締切の仕事を抱えてて、余裕全然ないんだってば。
おもしろそうなネタではあるんですけどね。
追記: 2008/1/21
真横で 第1回1000人スピーカカンファレンス が行われている中せっせと作ってたんですが、ちょうどこの記事が書きおわったころにカンファレンスが終わって「じゃあ時間ちょっと余ってるから誰か飛び入りでしゃべってみない~?」となったので、場外から飛び入り参戦してちょっとしゃべらせてもらっちゃいました(笑)。「Ruby と Javascript はどちらも Scheme の孫……ってことは JSRuby はいとこ同士で結婚したようなもんですねー」と演壇に立つ前は言おうと思ってたのにあわててて忘れちゃいましたとほほ。
3次会がずいぶんと楽しかったようなので、硬派ぶらずに(ん?)2次会以降にも参加すれば良かったかなー……
コメント (2)
書き忘れ。
非同期版JSRubyはまだ全然、元のJSRubyで出来ていたことの全てが出来るようにはなってません。特にクラス・メソッドは上のサンプルで使ったもの以外はほぼ全滅です……
投稿者: nakatani | 2008年01月19日 18:12
日時: 2008年01月19日 18:12
> いとこ同士で結婚したようなもんですねー
さらに「でも実は双子だったことがわかってしまって離婚させられるかもしれませんー」と続けるつもりだったことは内緒。
投稿者: nakatani | 2008年01月21日 13:10
日時: 2008年01月21日 13:10