Dies Aliquanti

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Ruby,GC,continuation

あいかわらず、Rubyやってます。。。ちょっと調べた中で面白いなーとおもったのは、「ごみ集め」Garbage Collectionと「継続」continuation。

ごみ集め
少々驚いたことに、古典的なmark&sweepで実装しているそうな。私はこのアルゴリズムの決定的な欠点は、実行時間(プログラムから見れば停止時間)が長いこと,と思う。「まつもとさん」も書いてますな。古典的なBasicでも同様の問題があって。メモリを48Kbyteしか積んでいない、Apple][のBASICでもGCが始まると数十秒待たされた気がしますし、大学のころ、先輩がバカでっかいLispプログラムをVAXで動かして、GCが始まると一時間単位で止まる(仮想記憶領域もGCされる)なんてことがありました。世代別GC、Generation Scavenging、(Symbolics3600だったっけ?)は却ってコスト高いのか・・・
LazySweepにしてもあまり効果ないみたい。Smalltalkとか、参照計数(Reference Count)を使っていたはず。Rubyも向いていると思うのだが、、、
いずれにしても、この手の古典的改良アルゴリズムはmark&sweepと併用しなければならないはずなので、一度動作しだしたら停止時間が長い、という問題の解決にはなりませんね。
GCをハードウェア化する、なんていう試みも昔はあったはず。そこまで、いかなくとも、並列GCとかでバックグラウンドで実行する(簡単ではない)とか必要ですね。

継続
なくなる方向だとか。まともなthreadの取り扱いができれば、特になくてもいいはず。現在Rubyにある理由が、「やってみたら出来たから」というのが笑えるが、実はあまり難しくないように思う。
学生時代に、C++ 1.0の実装(なんとプリプロセッサ)を調べていて、原始的なオブジェクトの(風の)扱い方を理解した気になっていた訳ですが、そのころ、輪読でModulaとかSchemeとかのコルーチンみたいなところで、set_jump/long_jumpとかが出来るなら、コルーチンの実装も難しくない、という話をして、C++ 1.0でのスタックフレームの扱い方と、コルーチンとの関連をはなしたところ、後輩が次の週に、MS-C用のコルーチンを作ってきたりして、あのころはなんつうか、冴えていたなーと思う、おじさんでした。




コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://diesaliquanti.blog.fc2.com/tb.php/593-2e31ed19
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。