Loading...
Flash Player 9 (or above) is needed to view slideshows. We have detected that you do not have it on your computer.To install it, go here
Slideshow Transcript
- Slide 1: Javascript で無限ルー プ を実現する5つの方法 yhara @京大マイコンクラブ
- Slide 2: 自己紹介 琵琶湖の方から来ました Javascript 暦は 2 年ちょっと 普段は Ruby 、ほかいろいろ ( 言語マニア ) 学生をしています
- Slide 3: 京都にはサイ本売ってない説
- Slide 4: ヨドバシ++
- Slide 5: (1) 普通に無限ループを書く for(;;){ while(true){ } } ブラウザが固まります(><)
- Slide 6: 予想される反論 無限ループなんてつかわねーよwww 無限でなくても、時間のかかる処理をループさ せるとやっぱりブラウザが固まってしまう while( 条件 ){ // 時間のかかる処理 }
- Slide 7: (2) setTimeout を使う setTimeout( 関数 , ミリ秒 ) 指定した時間後に指定した関数を実行してくれ る var f = function(){ // 時間のかかる処理 if( 条件 ) setTimeout(f, 0); }
- Slide 8: でも…、 setTimeout はめんどい 同期処理がしたいのに、非同期にしないといけ ない 理想 : ( 同期 ) 現実: ( 非同期 ) while( 条件 ){ var f = function(){ // 時間のかかる処理 // 時間のかかる処理 } if( 条件 ) setTimeout(f, 0); }
- Slide 9: 同様に Ajax もめんどい 同期処理がしたい時も、非同期にしないといけ ない 現実: ( 非同期 ) 理想 : ( 同期 ) Ajax.get(path, function(data){ data = Ajax.get(path); alert(data); alert(data); } じゃあどうしたらいい・・・?
- Slide 10: (3) jsThread 別名 Thread.Concurrent http://jsthread.sourceforge.net/cgi-bin/wiki/wiki.cgi JavaScript のみでスレッドシステムを実装! // ↓ ブラウザなぜか固まらない Concurrent.Thread.create(function(){ while( 条件 ){ // 時間のかかる処理 } });
- Slide 11: 仕組み Javascript で書かれた Javascript パーザ内蔵 指定した関数のソースコードを解析し、自動的 に setTimeout を挟んでくれる toSource() でソースが取れる javascript ならでは! 15,119 行の Javascript (1/8 現在 ) 無茶しやがってwww その他、サイトに解説あり http://jsthread.sourceforge.net/cgi-bin/wiki/wiki.cgi
- Slide 12: (4) JSDeffered 関数合成を駆使して、同期処理をそれっぽく書 ける http://coderepos.org/share/wiki/JSDeferred // loop の例: // next の例: loop(ary, function (n) { loop(5, function (i, o) { // 時間のかかる処理 // ループ処理 return wait(0.1); return o.last? i : wait(1); }); }). next(function (e) { // ループが終わったらする処理 print(\"end [\"+e+\"]\"); })
- Slide 13: 注意点 つづりが むずかしいです (^o^) × Deffered 〇 Deferred Defer ( 延期する ) + r + ed とおぼえよう!
- Slide 14: JSDeffered = DSL JavaScript を拡張した新しい言語みたいな感じ parallel() : 並列実行 wait() : 待つ、中断 next() : 順次実行 loop() : 繰り返し error() : エラー時 言語内言語?
- Slide 15: (5) Javascript で別の言語を実装 例えば Scheme http://mono.kmc.gr.jp/~yhara/w/?BiwaScheme
- Slide 16: BiwaScheme Javascript で書かれた Scheme 処理系 http://mono.kmc.gr.jp/~yhara/w/?BiwaScheme R6RS 準拠を目標に開発中です (><) (lambda (f) (let1 s (http-request (path)) ;; 時間のかかる処理 (print s)) (sleep 0) (if 条件 (f) 返り値 )) (sleep 0) のところでインタプリタの状態を保存 setTimeout で指定した時間後にインタプリタを再開
- Slide 17: JSRuby Javascript で書かれた Ruby 処理系 ( ! ) http://coderepos.org/share/wiki/JSRuby FizzBuzz を動かす程度の能力 sleep はまだなさそうだけど、原理的にはできるはず cf. HotRuby (YARV の中間コードを js で実行 ) http://d.hatena.ne.jp/yukoba/20071231/p1
- Slide 18: まとめ さよなら setTimeout とにかくわかりやすく書きたい→ jsThread とにかく軽い方がいい→ JSDeffered ( どちらでもない )→BiwaScheme
- Slide 19: おまけ (Reposh) Reposh – Repository Shell http://mono.kmc.gr.jp/~yhara/w/?Reposh Reposh なし : Reposh あり : $ svn st > [Enter] $ svn di foo.rb > di foo.rb $ svn ci –m “foo” > ci –m “foo” svn, svk, hg, darcs に対応 ( ディレクトリ構成から自動判定 )


