«前の日記(2006年01月22日) 最新 次の日記(2006年01月25日)» 編集

Matzにっき


2006年01月24日 [長年日記]

_ [Ruby] ruby_block撲滅運動

4844317210 『4844317210』14章「コンテキスト」によると、Rubyには実行時スタックが「なんと七本もある」のだそうだ。

そんなにあったっけ。

  • ruby_frame
  • ruby_scope
  • ruby_block
  • ruby_iter
  • ruby_dyna_vars
  • ruby_class
  • ruby_cref

ふむ、確かに七つリストされてるな。実際にはprot_tagもあるので8つだ。

この辺がRubyの実行系が複雑だと揶揄されている根源でもあるのだが、 ふと思い立って、ruby_blockをなくしてみようとやってみた。

ブロックとは本質的には引数の一部なので、引数が格納されるframeに置いてやるのがよいだろう。 ruby_frameに「struct BLOCK *block;」というメンバを追加する。

また、引数の一部であることからrb_call()やrb_call0()にblockを示す引数を追加する。 ブロックが与えられているときにはblock構造体を、ないときには0を渡すことにする。

イテレータを実現するNODE_ITERやNODE_FORを修正して、 rb_callを呼び出すときにblock構造体を渡すようにする。

ruby_blockがなくなったので、ruby_blockが現時点で有効かどうかを示すフラグである ruby_iterは不要になる。同様の理由でruby_frameのiterメンバも不要になる。

あとはそれらに付随していろいろごちゃごちゃと修正を加えると、 あら不思議ruby_blockは無くなってしまいました。 ついでにruby_iterもなくなってスタックは6本に。

スタックが少なくなって、 なんだかちょっとインタプリタがすっきりした(でもコード重複は増えちゃったけど)。

今までが100とすれば、今は99くらいかな。

パフォーマンスについても期待したんだけど、全然変わらないみたい。 まだ、make test-allが通らないんでcheck inはもう少し待ってね。

次はruby_classとruby_cbaseの統合かな。

しかし、『4844317210』って 絶版になってるの? Amazonでユーズド商品の価格が25,975円になってるんだけど。 こんなプレミア価格ってアリなの?

_ 『4086301636』

4840230242を購入したついでに買ってしまう。

いや、精神集中に素数計算を遅延実行すると書いてあったのに惹かれた というのが本音かもしれない。

sieve(n:ns) = n:sieve[m<-ns, m`rem`n/=0]

ってコードはHaskellだよね。前にakrさんがこの本のことに触れていたような気がするな。

でも、プログラムが出てくるのはそこだけで、 後はまあコンピュータは単なる小道具くらいかな。 登場人物の一人(女子高生)が「CとPerlならわかるけど」と発言するくらいかな、 業界人として面白かったのは。

しかし、

  • ある種のパターンが空間に作用することが魔法の原理
  • コンピュータによってそのパターンを構成させるのが現代魔法

という設定はなかなかよろしかった。のに、ちょっと消化不良な感が。

いや、業界人が喜ぶ話は、きっと一般人には面白くもなんともないんだろうから、 ラノベとしては成功しなさそう。

ところで、二巻『4086301849』も 眺めてみたのだが、レベルは同じ程度。素材はいいと思うんだけどなあ。

この巻のタイトルであるGCには思い入れがあるぶん、辛くなってしまう。 なんだよ、「マーカー」と「リファレンサー」が 「ガーベージコレクター」が回収しないように保護するってのは。 そこは「マーカー」が「スイーパー」から保護するって言わなくちゃ。 「マーク&スイープ」を採用してるんなら。

いや、人間の記憶のGCってどうなってんのかな、正直な話。 なんか参照されてても平気で回収されてるような気がするな。


«前の日記(2006年01月22日) 最新 次の日記(2006年01月25日)» 編集