Javascriptで無限ループを実現する5つの方法

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

1 comments

Comments 1 - 1 of 1 previous next Post a comment

  • + guest0a9bc9 guest0a9bc9 2 years ago
    発想にうけた。JavascriptでScheme処理系を実装している人が

    いるんだってはじめてしりました。すごい。
Post a comment
Embed Video
Edit your comment Cancel

3 Favorites

Javascriptで無限ループを実現する5つの方法 - Presentation Transcript

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

+ yharayhara, 2 years ago

custom

9138 views, 3 favs, 1 embeds more stats

LightningTalk at Kanasan.JS, Japanese Javascript Us more

More info about this document

© All Rights Reserved

Go to text version

  • Total Views 9138
    • 9125 on SlideShare
    • 13 from embeds
  • Comments 1
  • Favorites 3
  • Downloads 14
Most viewed embeds
  • 13 views on http://d.hatena.ne.jp

more

All embeds
  • 13 views on http://d.hatena.ne.jp

less

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

Cancel
File a copyright complaint
Having problems? Go to our helpdesk?

Categories