『Rubyソースコード完全ガイド』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の統合かな。
しかし、『Rubyソースコード完全ガイド』って 絶版になってるの? Amazonでユーズド商品の価格が25,975円になってるんだけど。 こんなプレミア価格ってアリなの?
娘に頼まれた本を購入したついでに買ってしまう。
いや、精神集中に素数計算を遅延実行すると書いてあったのに惹かれた というのが本音かもしれない。
sieve(n:ns) = n:sieve[m<-ns, m`rem`n/=0]
ってコードはHaskellだよね。前にakrさんがこの本のことに触れていたような気がするな。
でも、プログラムが出てくるのはそこだけで、 後はまあコンピュータは単なる小道具くらいかな。 登場人物の一人(女子高生)が「CとPerlならわかるけど」と発言するくらいかな、 業界人として面白かったのは。
しかし、
という設定はなかなかよろしかった。のに、ちょっと消化不良な感が。
いや、業界人が喜ぶ話は、きっと一般人には面白くもなんともないんだろうから、 ラノベとしては成功しなさそう。
ところで、二巻『ガーベージコレクター』も 眺めてみたのだが、レベルは同じ程度。素材はいいと思うんだけどなあ。
この巻のタイトルであるGCには思い入れがあるぶん、辛くなってしまう。 なんだよ、「マーカー」と「リファレンサー」が 「ガーベージコレクター」が回収しないように保護するってのは。 そこは「マーカー」が「スイーパー」から保護するって言わなくちゃ。 「マーク&スイープ」を採用してるんなら。
いや、人間の記憶のGCってどうなってんのかな、正直な話。 なんか参照されてても平気で回収されてるような気がするな。
よくわかる現代魔法 といえば たらい/Haskell vs Ruby/遅延評価
です。
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%a4%bf%a4%e9%a4%a4%a4%de%a4%ef%a4%b7%a4%d9%a4%f3%a4%c1
え,cbaseとcref(cbase)って統合できますか?
桜坂洋というと
http://www.amazon.co.jp/exec/obidos/ASIN/4150308004/qid=1138508554/sr=1-2/ref=sr_1_10_2/250-3000310-2437017
も面白いですよ、たぶん。
特に理由もなく向こうから好きになってくれる女の子という設定が許せるならですが。
無理かも。cbaseとclassの統合。
まだちゃんと検討していないので。