4844317210 『4844317210』14章「コンテキスト」によると、Rubyには実行時スタックが「なんと七本もある」のだそうだ。
そんなにあったっけ。
ふむ、確かに七つリストされてるな。実際には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円になってるんだけど。 こんなプレミア価格ってアリなの?
4840230242を購入したついでに買ってしまう。
いや、精神集中に素数計算を遅延実行すると書いてあったのに惹かれた というのが本音かもしれない。
sieve(n:ns) = n:sieve[m<-ns, m`rem`n/=0]
ってコードはHaskellだよね。前にakrさんがこの本のことに触れていたような気がするな。
でも、プログラムが出てくるのはそこだけで、 後はまあコンピュータは単なる小道具くらいかな。 登場人物の一人(女子高生)が「CとPerlならわかるけど」と発言するくらいかな、 業界人として面白かったのは。
しかし、
という設定はなかなかよろしかった。のに、ちょっと消化不良な感が。
いや、業界人が喜ぶ話は、きっと一般人には面白くもなんともないんだろうから、 ラノベとしては成功しなさそう。
ところで、二巻『4086301849』も 眺めてみたのだが、レベルは同じ程度。素材はいいと思うんだけどなあ。
この巻のタイトルであるGCには思い入れがあるぶん、辛くなってしまう。 なんだよ、「マーカー」と「リファレンサー」が 「ガーベージコレクター」が回収しないように保護するってのは。 そこは「マーカー」が「スイーパー」から保護するって言わなくちゃ。 「マーク&スイープ」を採用してるんなら。
いや、人間の記憶のGCってどうなってんのかな、正直な話。 なんか参照されてても平気で回収されてるような気がするな。