雨降りませんように。
Google: yarv で、「もしかして: year」と言われなくなりました。めでたい。
というわけで、yarv 0.3.1 をリリースしました。
YARV 0.3.1 was released. It's only bug fix release.
yarv バグ。
VALUE hoge(){ ... huga(); }
... 。x86 だとこれで問題が出なかったという。
なんかすごいことになってるなぁ。ここで話すのか...。
ネストしてるクラス定義を分けると、定数探索スコープに違いが出てくるね。
Const = 0 class A Const = 1 class B def m p Const end end end class A::C def m p Const end end A::B.new.m #=> 1 A::C.new.m #=> 0
バリと見て、フランスかー、と思ったばか者(もちろん、パリと空目)。
だらだら。今年はスキーしたいな。
そして日常に戻る。
生協の店長にいやみを言われる。
内倉要, 笹田耕一, 佐藤未来子, 加藤義人, 大和仁典, 中條拓伯, 並木美太郎: SMTプロセッサにおけるスレッドスケジューラの開発, 情報処理学会論文誌, Vol.46, No.SIG12(ACS11), pp.150-160 (2005)
後輩の論文が載ったらしい。めでたい。
おわりました。お疲れ様でした。
それなりに受けた、と思っていいんだろうか...。
全然気づかなかったんだけれども、お会いできるのに気づかなかった方がかなりいらっしゃるらしい。顔と名前が一致しなくてダメダメ。
そういえば、かずひこさんのデモが、デザインが凄くいいんだよね。スライドから、プレゼンの構成から。さすがです。
ところで、リファラデータベースはオンメモリで持っておくほうがいいと思うんだけど、どうでしょうね。多分、リファラは 10K エントリはいかないと思うんだけれど。1エントリ 100byte 消費すると考えても 1MB だ。
GC は頻発するかもしれないな。
これからは駄目なRubyistのささだ、と名乗ることにしよう。
忘れないうちにメモ。
時間をきちんと守ったのは俺だけだった(いや、短すぎたか?)のは(それだけが)自慢。
昼飯は中華料理屋でラーメン。
そして、Ruby ヲタの群れへ。Ruby 開発が進んでいるようだった。
そしてロフトプラスワン。
そして抽選には当たらず。しょぼん。あるところには集まるものなんだなぁ。
そしてタクシーでラーメン。タクシーでラーメン屋に行ったのは生まれて初めてだ。できれば最後にしたい。
朝までコースの人たちも居たのか。そっちに合流したかったな(電話が通じなかった)。
いろいろ日記などで確認する限り、use は要らないと思った。きっちりと議論する場所があればいいと思うんだけれど、どうなのかな。
やはり、もうちょっと議論する場所があったらいいな、と思うんだけれど、なかなかそういう機会はないなぁ。
Kahua が継続情報として保持するのは call/cc で補足した継続じゃなくて、クロージャです。意味的にはあまり違いは無いんだけれど(見方によっては、ね)、食うメモリ量が全然違う(と、思う)。
俺が Kahua プロジェクトの一員(だった?)というのはあまり知られていない。当たり前か。最近全然使ってないけど...。
あぁ、やっぱりもっと他の方にご挨拶したかった orz 知らない人にもしり込みしないで挨拶しないと駄目だなぁ orz
やはり駄目駄目な rubyist だ。
langsmith に振ってみた。
未踏飲み会、またの名を池田さんを囲む会。楽しかった。あそこはいつも時間が速く過ぎる。RHG などとはまた違ったコミュニティで楽しい。お金のにおいもする(例外的に、俺にはしない)。
竹内先生がいらっしゃるとは思わなかった。来年の東大入試の問題聞いちゃった♪(いや、多分ネタだろうけど)
後藤さんには大変失礼なことを言ってしまった気がするけど、酔ってるからいいよね♪
http://amrita.s14.xrea.com/d/?date=20050825#c17 全然追ってないのでわからないんだけど。大穴に大爆笑してしまった。
飲みすぎて体中がいたいー。
ふたりの証拠読了。時が移るのがはやいなぁ。
起きたらだいぶ酒が抜けた。
わーい。「Javaプログラマガ知ツテオクベキコト」あたったー。
懇親会の金勘定をする。どうにも、飯の量などはわからない...。
多分この期間は酒は飲まないほうがよさそうだな...。
女性職員が預金10億円着服 東京三菱銀に業務改善命令。どうやったら10億なんて使えるんだ...。
こっちは懇親会費用で4000円ほど予定外に減ったので四苦八苦しているというのに orz
なんか、激しく目が霞む。
朝起きたら頭が激しく痛い。
なんか最近コーディングじゃなくてネゴネゴしてばっかりな気がする。
なんで遠藤さん英語なんだろう。
無理しないように
今日もるびまの日。
なぜか忙しい。
とりあえず Language Update の資料を書いてみた。
突っ込み歓迎。明日になったら LLDN さんに投げよう。
なんか体の調子が激しく悪い。
「2005年度日本OSS貢献者賞」の受賞者を選定。おー、Rubyist が四人中三人も。
RHG読書会でした。
そして今日は sicp-reading。5章は(簡単で)楽しいなあ。
いや、微妙に難しい。
Language Update ってまだ資料作ってない。さて、何をいつまでに作ればいいんだろう。
るびま関係でメールを書きまくる。
http://www.itmedia.co.jp/news/articles/0508/19/news029_2.html
2人で監視しながらプログラミングする「ペアプロラミング」にも慣れてきた
「ペアプロ=相互監視」と断定してるのがすごい。
さて、parse.y から ruby_dyna_vars を消せるだろうか。
本当は青木さんに投げようと思ってたんだけど、やっぱり自分でやらんとあかんかなぁ。
yycompile() を見ると、まず ruby_dyna_vars を保存する。
んで、パースが終わったら ruby_dyna_vars をリストアする。
parse 中に作った vars は全部消す。
ということは、ruby_dyna_vars を place holder にしているだけで、別に ruby_dyna_vars である必要は無いんだよね。
たとえば、ruby_dyna_vars の今のリストの値を全部コピーして、そして ruby_dyna_vars にそいつを入れても全然困らない(あとで元に戻すんだから)。
だから、ruby_dyna_vars の修正はそんなに難しくない、と踏んだのだけれど、真相はいかに。
ところで、ruby_dyna_vars を直接参照するんじゃなくて、せめて parser_params に入れませんかね?
$<hoge>1 とかの意味がさっぱりわからなかったんだけど、教えてもらった。
紛らわしい。
さすがにずーっと見てると、何やってるかわかってくるなぁ。
arton さんちに突っ込もうと思ったらパーミッションでぃないどだったので、こっちに。
今のところ、eval.c にパッチをあてた ruby でテストを実行しようとすると、拡張ライブラリ用のテストを動かそうとしてそうなります。
これは、改善しないと駄目な気がするのでします。多分。
Index: parse.y =================================================================== --- parse.y (revision 248) +++ parse.y (working copy) @@ -147,6 +147,7 @@ VALUE (*parser_lex_gets) _((struct parser_params*,VALUE)); struct local_vars *parser_lvtbl; int parser_ruby__end__seen; + struct RVarmap *parser_dyna_vars; #ifndef RIPPER /* Ruby core only */ NODE *parser_eval_tree_begin; @@ -170,6 +171,7 @@ int has_shebang; }; +extern struct RVarmap* rb_dvar_current_list(); static int parser_yyerror _((struct parser_params*, const char*)); #define yyerror(msg) parser_yyerror(parser, msg) @@ -205,6 +207,7 @@ #define lex_gets (parser->parser_lex_gets) #define lvtbl (parser->parser_lvtbl) #define ruby__end__seen (parser->parser_ruby__end__seen) +#define ruby_dyna_vars (parser->parser_dyna_vars) #ifdef RIPPER #define ruby_sourceline (parser->parser_ruby_sourceline) #define ruby_sourcefile (parser->parser_ruby_sourcefile) @@ -318,6 +321,13 @@ static int lvar_defined_gen _((struct parser_params*, ID)); #define lvar_defined(id) lvar_defined_gen(parser, id) +static void rb_dvar_push_local _((struct parser_params *, ID, VALUE)); +#define rb_dvar_push(i, v) rb_dvar_push_local(parser, i, v); +static VALUE rb_dvar_defined_local _((struct parser_params *, ID)); +#define rb_dvar_defined(i) rb_dvar_defined_local(parser, i) +static VALUE rb_dvar_curr_local _((struct parser_params *, ID)); +#define rb_dvar_curr(i) rb_dvar_curr_local(parser, i) + #define RE_OPTION_ONCE 0x80 #define NODE_STRTERM NODE_ZARRAY /* nothing to gc */ @@ -8736,6 +8746,7 @@ parser->parser_lex_pend = 0; parser->parser_lvtbl = 0; parser->parser_ruby__end__seen = 0; + parser->parser_dyna_vars = rb_dvar_current_list(); #ifndef RIPPER parser->parser_eval_tree_begin = 0; parser->parser_eval_tree = 0; @@ -9373,3 +9384,58 @@ rb_intern("&&"); } #endif /* RIPPER */ + + +static struct RVarmap* +new_dvar(id, value, prev) + ID id; + VALUE value; + struct RVarmap *prev; +{ + NEWOBJ(vars, struct RVarmap); + OBJSETUP(vars, 0, T_VARMAP); + vars->id = id; + vars->val = value; + vars->next = prev; + + return vars; +} + +static void +rb_dvar_push_local(parser, id, value) + struct parser_params *parser; + ID id; + VALUE value; +{ + ruby_dyna_vars = new_dvar(id, value, ruby_dyna_vars); +} + +static VALUE +rb_dvar_curr_local(parser, id) + struct parser_params *parser; + ID id; +{ + struct RVarmap *vars = ruby_dyna_vars; + + while (vars) { + if (vars->id == 0) break; + if (vars->id == id) return Qtrue; + vars = vars->next; + } + return Qfalse; +} + +static VALUE +rb_dvar_defined_local(parser, id) + struct parser_params *parser; + ID id; +{ + struct RVarmap *vars = ruby_dyna_vars; + + while (vars) { + if (vars->id == id) return Qtrue; + vars = vars->next; + } + return Qfalse; +} +
これで、ruby_dyna_vars の呪いは消せたけど、多分これじゃ駄目だよなぁ。
ちなみに、こうやってくれると、eval.c から dyna_vars は消えるのです。
それとも yarv版 parse.y をこうやってしまおうかなぁ。でも、そうすると parse.y の追従が大変...(今は単純に差し替えればいい)。
ちなみに、dyna_vars を残しているのは過渡期だからで、もちろん最終的には parse.y からも消えます。さて、そこで dyna_vars のために利用するのは何になるかな。気合入れればなんとかなると思うけど、そのあとの追従のコストが...。
これ、方針が違うな。ruby_dyna_vars 全部要らない気がする。local_vars#dnames で全部出来そう。
そうやって書き直そう。
書き直すのめんどくさくなってしまった。
わーい。今日はいい日だ。
学校いかないとなあ。
今日は一日 parse.y とにらめっこしていたような気がする。
応援してます。がんばれー
mixi の姉妹サイト taxi。
ゴスロリ男もすごいけど、それよりもグインサーガもう103巻出ていたということに驚いた。
悪童日記読了。ちょこっとだけのつもりが、全部読んでしまった。
http://www.ikvm.net/ なんてのがあるのねぇ。
無いと困るのでOOo を入れる。あれ、2 ってまだでないんだっけ? ということで、2 beta を入れてみる。だいぶ派手になってるなぁ。
豚の死なない日読了。同じ少年の物語なんだが、ずいぶんと違う。
質問です。make yarv-test-allって、minirubyができた時点のbuildディレクトリで実行できるはず?
うちの環境では出来てます。gcc 4.0 では試してません。
taxiで笑っちまったオレは負け組
gcc4.0 で 昨日 HEAD で試しましたが大丈夫みたいでした
どうもありがとうございます。最適化しなければ gcc 4.0 でも動くんだなあ。インラインアセンブラつかったら負けってことか。
ブロックローカル変数を探す、というのをやってたんだけど、現実的じゃないことに気づく。
今のRubyは「ブロックローカル変数を探して、無かったら追加する」というスタイルを取るので、ブロックごとにそのブロックで初出のブロックローカル変数のリストというものは無い(多分)。
だから、複雑な式の中にあってもよい。
def iter arg yield arg end ary = [1,2,3] iter(1){|ary[ary.size > 0 ? 1 : (b = 2)]| p b } p ary
でも、YARV では先に dynamic 変数のリストがないと困る。ので、今探してるんだけど、node を探すのは、上記例みたいなのは限界。
こんな苦労は、ブロックローカル変数のリストを知ることが出来ればしなくてもよい。これは、パーサを変更する必要がある。
で、変更しなくちゃいけないんだけど、パーサを変更すると、拡張ライブラリ版が動かなくなっちゃうんだよな。妙なところに足枷が。
存外、マージ版がもう動いてるからやめようかなぁ。
[[1, [2, 3]], [4, [5, 6]]].each{|a, (b, c)| p [a, b, c] }
がやっと動くようになった。
ans = [] [[1, [2, 3]], [4, [5, 6]]].map{|a, (b, c)| ans << [a, b, c] } + ans
こんなのもちゃんと動く。
で、mkmf.rb を動かそうとおもってがんばってるんですが、なんというかこんな書き方しねー、というののオンパレードで...。
SRCS = #{srcs.collect(&File.method(:basename)).join(' ')}
srcs.collect{|e| File.basename(e)} のほうがよっぽどわかりやすいと思うんだけどなあ。
Method クラスってまともに考えたこと無かったんだけど、
class MO def initialize obj, mid @obj = obj @mid = mid.to_sym end def call *args @obj.__send__ @mid, *args end end class Object def method2 mid MO.new(self, mid) end end
これで全て?
to_proc があるのか。
http://www.atdot.net/~ko1/archive/ 一応、こんなページも用意していたり。
雑多な作業が多すぎて、なんかやる気がなくなってきた。10年はやはり重い。
mkmf が使えないので socket が作れない。しょぼん。
trace_func は recompile をして対応しようと思ってたけど、そいつの GC の問題を考えていなかった。どうしたもんだろうなぁ。
今のところ、C 拡張ライブラリは書き直しが必要ないようにしようと考えています。
つまり、Ruby C API の互換レイヤを設けようかな、と。
もちろん、一切不要、というわけにはいかないでしょうが。
ふと、サンディエゴへ格安航空券だったらどうなるか検索してみる。6万円のがあった。復路がニューアーク経由...。なぜ戻る。コンチネンタルは安いんだなぁ。去年は全部それだった気がする。
はじめての nmake。
@exit <<$@ ... (内容) <<KEEP
こいつが何をやってるんだかさっぱりわからなかったんだけど、$@ (ルール名)というファイル名で (内容) を保存せよ、ってことなのね。
しかし、こいつで作る config.status って何? s,@CFLAGS@,-MD -Zi -O2b2x -G6,;t t
みたいなことが書いてあるけど。
あとで ruby でパースして rbconfig.rb を作るときに使うんだろうか。mkconfig.rb を見ると、そうっぽい。
うわー、凄いなあ。
となると、Makefile.in と common.mk の切り分けを勘違いしていたな。テストコード用ルールとかは全部 common.mk でいいのか。
とすると、Ruby with YARV は意外と簡単に mswin32 で動くかも?
Ruby with YARV とかなんとか書いているのはいい加減うっとおしいけど、Rite と明言するのも気が引ける。なんか無いかな。
rubyarv?
テストを間違えて、全然意味の無いことをして、テストが通ったと喜んでいた orz
直して、ちゃんと通ったことを確認。
双方向パイプがうまく行かない件については、しょうがないからソケット通信でテストをやらせようかと思ったんだけど、まだ socket.so を作っていないことに気づく。
ブロックパラメータだけど、{:(x, y) ...}
なんてどうだろう。
[a, b, c].map {:(x, y=1) ...} [a, b, c].map do :(x, y=1) ... end
駄目っぽい。ちょっと smalltalk っぽくなるかと思ったんだけど。
diff と patch の使い方はさっぱりなんですが、diff -ub で作った patch を patch -lu で食わせようとしても reject されて、diff -cb で作った patch を patch -lc で食わせるとすんなり通った。なんで? と思ったら、逆もあった。
diff -b -U 4 にしたらあたった。
-U 4
じゃ駄目な場合があったので、-U 8 にしてみた。さて、ふつーはどうするんでしょうか。
fileutils.rb を読み込めるように頑張るか、と思って fileutils.rb を lib に追加してみたら、死亡。
iter{ begin rescue => e end }
で、e が見つけられなくて死亡。これは気づかなかった。どうしよう。
ごにょごにょと弄って ruby コマンドまで作ることができた。
With some fixes, Ruby command with YARV becomes :)
yield with values の仕様をそろそろはっきりさせないと、ある部分がこれ以上進まない気がする。
ブロックパラメータの設定は多重代入である、という原則は残るんだろうか。そのとき、オプションパラメータとかはどうなるんだろうか。
もしかして、多重代入にオプションパラメータとか設定できたりして? うわー、嫌だ。
(a, b=:b) = ary # ary == [1, 2] a => 1, b => 2 # ary == [1] a => 1, b => :b
今、この辺はスゲーー中途半端。
スタックの拡張というのはよく聞く話だが、スタックの縮小をやる言語処理系はあるんだろうか?
ちょっと考えてみると、たとえばGC(世代別だったらメジャーコレクションのとき)のタイミングでちっちゃくすることは出来そう。
ライフタイムの長いプロセスを扱うには、あったほうがいいんかも。
多重代入のサポート、(a, b), c = [[1,2],3]とかの準備を全然していない。どうしようかなあ。
頑張って作るかなあ。
というわけで、ちょっと頑張ってみたら、さっぱり出来なかった。というか、昔書いたコンパイラの部分が全然解読できない。
ary = [[1, 2], 3, [4,5]] (a, b), c, (d, e) = ary p [a,b,c,d,e]
やっとこれが通るようになった。この変更で、だいぶ massign については見通しがよくなったと思う。
def test_nested_massign ae %q{ (a, b), c = [[1, 2], 3] [a, b, c] } ae %q{ a, (b, c) = [[1, 2], 3] [a, b, c] } ae %q{ a, (b, c) = [1, [2, 3]] [a, b, c] } ae %q{ (a, b), *c = [[1, 2], 3] [a, b, c] } ae %q{ (a, b), c, (d, e) = [[1, 2], 3, [4, 5]] [a, b, c, d, e] } ae %q{ (a, *b), c, (d, e, *) = [[1, 2], 3, [4, 5]] [a, b, c, d, e] } ae %q{ (a, b), c, (d, *e) = [[1, 2, 3], 3, [4, 5, 6, 7]] [a, b, c, d, e] } ae %q{ (a, (b1, b2)), c, (d, e) = [[1, 2], 3, [4, 5]] [a, b1, b2, c, d, e] } ae %q{ (a, (b1, b2)), c, (d, e) = [[1, [21, 22]], 3, [4, 5]] [a, b1, b2, c, d, e] } end
これくらいのテストが通るようになった。他に例はないかな。
あとは、ブロックパラメータが massign のときの対処だなあ。
YARV と Ruby をマージしました!
$ ./miniruby.exe -v ruby 1.9.0 (2005-08-13) [i386-cygwin] YARVCore 0.3.0 (rev: 229) YARVCore options:
... 冗談です。もちろん。
一応、少しずつ動くようになってるんだな。
ブートストラップで死亡。
そりゃーそうだよなあ。どうしよう。
YARV用に用意したテスト全部通った。
All tests (for YARV) are passed on YARV merged Ruby!
さて、とりあえず通したので、0.3.0 としてリリースしちゃったほうが、色々とにぎやかでいいかなぁ。
メソッドキャッシュを誰が持つか思案中。スレッドごとに持たせておけば、排他制御とか考えなくていいから、そうしようかなぁ、と思っている。
必要なメモリ量が、スレッド数に比例して増えていくのがどうかな、と。今は 0x800 エントリなので、48KB。これを、1024エントリにしてみるとか、どうだろう。4KB くらいか。
1024エントリで足りるか、ってのは問題。
OOPSLA の submit。
というわけで、yarv 0.3.0 なわけです。
それなりに感慨深くはあるわけですが、作業自体はちょっと繋いだだけなので、これからのレガシーコードの除去が楽しくもあるわけですが。
visibility のサポートを全然やっていないので、その辺の機能の追従がとても面倒そうだなあ、誰かやってくれないかなぁ、などと思う最近。
そういえば、テストケース募集。きっとまずいパターンは色々あるに違いない。
YARV 0.3.0 was released!. You can get Rite now.
テストは IO.popen でふつーの ruby と ruby with YARV で実行した結果の文字列を比較するので、IO.popen がダメダメな mswin32 だとテストできないかも。どうしたもんかいな。
xyzzy と ruby mswin32 の通信では結構うまくいくんだけどな。あ、同じように最後に 0x1a でも送ればいいのかしらん。
その代わり、xyzzy と ruby cygwin との通信はうまくいかないんだな。
今回のるびまつらい...。自分の首を絞めてるなぁ。
帰ろうかなぁ、でも雨が降ってるから今日は泊りかなあ、と思って夕飯を買ってきてみれば、今雨やんでるし。しくしく。
Perlプログラマのレベル10というのを知らなくて、Scheme:Schemeプログラマのレベル10を見て一人でにやにやしてたんですが。しかし、Scheme プログラマのレベルはえらい高いなあ。ヒエラルキーがえらいとんがってる気がするんだけど、そもそも Scheme プログラマ人口を考えるともともととんがってるのか?
まぁ、ここで Ruby プログラマの〜 なんていうと何も考えてない馬鹿だと思われるのだけれど、まぁ馬鹿なので問題ない。
ちなみに私は Python がわからないので 2 以上にいけません。
何がつらいって、昨日の段階でチェックアウトしたのを元にしようとしているところが。
ちなみに、YARV だときちんと優先順位はあわせていたりする。
ruby のソースいじるときは、やっぱりインデントレベルを今までどおりに合わせる必要があるかなあ。あとで、整形ツールであわせるようにすればいいか。
コミットしちゃった。
Ctrl+Space で xyzzy でマークできないと悩んでいたら、MS-IME に入力を食われていたことがわかった。いや、自分がIMEの設定ミスったんですが。
nd_rest の扱いが変わっていて全然動かない。まずい。
やっと通った。
nd_rest の扱いが assign な node になっていて、argc を nd_cnt じゃなくて、nd_frml という枝で管理して、そいつには配列が入ってるらしい。なんでこんな変更したんだろう? zsuper 絡み?
というわけで、YARV は最新の HEAD じゃないと動かなくなった。
rest argument に対する zsuper の振る舞いはどうするべきなんでしょうか。この辺の仕様を固めてほしい...。
ruby を svn リポジトリに突っ込む方法で、やっぱりまだ悩む(yarv を cvs リポジトリに突っ込む方法ではない)。
trunk/ [yarv files](拡張ライブラリが作れる) ruby/ [ruby files] [yarv files へのリンク](yarv を ruby に突っ込んだものができる)
にしよう、というのが私の提案で、
trunk/ [ruby files] [yarv files](yarv を ruby に突っ込んだものができる) yarvext/ [yarv files へのリンク](拡張ライブラリが作れる)
にしよう、というのが青木さんの提案。
笹田案は、yarv 構成ファイルが一目で判断できるのが○。ファイルが少なくて見やすい。切り分けが楽。
青木案は、ruby リポジトリに突っ込む環境に限りなく近くなるのが○。
ファイル多いのがやだなぁ、とぼやく笹田に、青木さんはこんなの少ないと一蹴。
拡張ライブラリとしての yarv はやっぱり(YARVオンリーの)開発としてはやりやすいので、混ぜたくないなぁ、と思ってはいるのだけれど。
結局、作るファイルの個数は変わらなくて、場所が違う。
多分、yarv 単体で見ている俺と、ruby のための yarv としてみている青木さんの違いなんだと思う。
さて、どうしたものか(いや、昨日は青木案で行こうとしたんだけれど...)。
こっそりと current HEAD に対応した YARV 0.2.3 をリリース。
こっそりなので、アナウンスはしない。
あー、笹田案にあと一個利点があった。インポートが楽。(刹那的といわれるんだろうなあ)。
ぎゃー。
とりあえず、青木案で行くことに。
やらないといけないこと。
最初、取り去ってから、と思ったけど、それまでの作業量が半端じゃないだろうな。
で、さて、コミットはどの時点でするべきか。
fsck でとまって停電から自動回復ならず。
AMD64 マシンが来た。動かすのは win32 だけど。
速い気がするけどうるさい。
まずいなー、やる気なし週間に突入してしまった。
[ruby-talk:133992] 、tail call optimization 考えてたのか。んーと、どうやるんだろう。
AMD64 では VTune が使えないのか orz
なんて、なんて無様。
考えてみればあたりまえか。"Intel" VTune だもんなぁ。
どーーーしよ。
YARVなら素直にできるんでないの? Cレベルで再帰してるエンジンなら末尾呼び出しだけトランポリン、かな。
YARVでは一応試験的に実装してあります(コンパイラがきちんと出来てないけど...) 現在の処理系だとどうするのかな、と考えてみました。
つ[ruby-dev: 10921]
前田さんもついにタイムマシンを!(違
あれだと return (x() && y()) の y() をtail callにできるのかしらん。まあ、パーザがtail positionであるという情報を受渡していけばいいだけなんで本質的な困難ではないでしょうが。
く、食わず嫌いって...
本日 8/10 、本学工学部が停電します。8時くらいから16時くらいだったと思うけど、もっと延びるかも。
atdot.net いきのメールなども通じないので、よろしく。
IRC や skype は生きてる予定です。
eto さんの Modulobe を試してみたら、win2k がさくっと死んだ。多分、direct x 関係なんだろうなぁ。dual display だからかも。
一度 Thunderbird の迷惑メールフィルタで殆どのメールを迷惑メールにされてしまったため、用心していたのだけれど、百通単位の spam はやはりつらいのでもう一度有効にしてみた。きちんと学習してるかなあ。
8/10は本学工学部の停電だそうで、atdot.net なども止まります。ごめんなさい。
best hacker スゲー。
http://www.rubyist.net/~matz/slides/oscon2005/mgp00005.html 今は無き「ルビま!」世界へ。
YARV 0.2.2 リリースしました。
次は 0.3.0 です。本当は、今回 0.3.0 にするつもりだったんですけどね。一週間こもって書く予定。
例によって未踏の進捗が遅れてるわけですが、千葉先生に厳しい叱責を受ける。すみません、8月は集中します。
ホテルでネットが出来る、と書いてあったのに、なんか契約が必要らしかった。詐欺だ。TVも電源入らないし。もう絶対いかねー。
今度は雨で飛行機が遅れるっぽい。
今回は交通機関が全然駄目駄目な出張だった。
まぁ、生きてるからいいか。
結局一時間遅れ
PRO が終わると、ARC も無いのでなかなか見たいものがない。
OOPSLA ポスター通った。めでたい。
というわけで、昨日はモツを食う。
屋台では食わず。
若手の会は、そろそろ定員の予感。
なんとか今からでも、ということがあれば、ご連絡ください。
あぁ、やばい。久々にやばい。
43ページを30ページにちじめる。これなら25分でも大丈夫じゃなかろうか。
やばいと、YARV の実装アイデアが浮かぶ。
先日の AOT の考察は、あれは嘘な気がする。必要なのは、大域ジャンプから返ってきたときのエントリポイントだけな気がする。
となると、
compiled(pos){ switch(pos){ 1: ... 2: ... 3: ... } }
これでいいような気がする。
スコープを積む行為は、「VMループを再帰呼び出し」で、いいような気がしている。setjmp のコストが気になっていたんだけれど、setjmp 実はイラネージャン、と気づいた。
あとは、関数呼び出しのコストと、関数から戻るコストの単純な比較だけが残る。今マシンスタックを見てみたら、VM関数が大量のスタックを食っている予感。900 words か。
もうちょっと変数を共有してくれればいいんだけどなぁ。
またラーメン屋を発見できなかった orz
ちゃんと住所や地図を控えていかないと駄目だなあ。さようなら電車代。さようなら探し回った1時間半。
発表終わり。
質疑応答が全然答えられなかった。非常にわかりきった質問なのに、(明確な)答えを用意していかなかったのが敗因。ぐだぐだになってしまった。
うぅ、8/1中に帰れなかった。
最近、発表の準備を直前にしかしなくなっている。とても不味い癖がついてしまっている。良く無さ杉。
ネタ系(注:オープンソースなイベント系)は直前でもだいたい間に合うから、そういうようになってしまっているんだろうな。
自分にとって本番、本業であるはずの学会発表をそんなノリでやってしまっている。激しくよくない。
RubyConf の準備は(これもネタ系といえばネタ系だが)9月から、いや、8月からやるべきか。
さて、羽田までどうやっていこう。南武線を使ったほうが京王線・新宿・品川経由よりもちょっと速いが 20円高い。
では出発。
羽田空港の電源トラブルは11時30分ごろだそうです。
私の飛行機は11時35分出発予定でした。
・・・見事見事にひっかかりました。エンジンも順調でもう出るぞ、というところで、止まってしまった。なんともはや。まぁ、飛ぶときに狂って落ちる、ということが無かっただけましか。
結局、1時30分到着予定が3時到着。色々と予定が狂いまくり。
でも、大宰府には行った。これで明日の発表はばっちりだ。
8月だー。
rb_ary_replace が export されていないので悲しいことに。しょうがないので rb_funcall2 を呼んでしまった。
なんか奇妙なエラーが出ると思ったら、require した命令列オブジェクトを mark する方法がなかった。どうしよう。メソッド定義されたら、そのメソッドを mark するようにしたいんだけど、どうやったらいいんかなぁ。
メソッドを記録するための NODE を NODE_METHOD にすることで解決。うう、この数時間が。
そういえば、情報科学若手の会、まだ若干名(詳しくは内緒)の余裕がございます。この業界にいる若手の人で、わいわいディスカッションをするのが好きな方、一緒に議論してみませんか。
もうちょっとウリを書いておこう。
予算は2万円です。交通費込み。なんで2万円ということがわかるかというと、交通費補助が出るからです。だから、北海道からきても、東京からきても、九州からきても、多分2万円です。参加費1.5万円だから、だいたい5000円負担してね、残りはだいたい出すから、という感じ。でも、海外から来る人には出せないかも(こねーよ)。
今年は、東京近郊で、東京近郊の学生の参加者が多そうなので、もっと補助が出せるかも。
宿は、今年は綺麗です。去年は正直ぼろかった。携帯届かなかったし。今年はそんなことないです。ネットワークも完備です。これでるびまが書けます。
他には何があるかな。飯はわからない。ふつーっぽい。
宴会やります。毎晩。
あと何かな。やっぱりなかなか会う機会がない人との交流かな。
ちなみに、若手の定義は自己申告らしいんで。よろしく>若手の人
8/5 はやっぱりホテルに泊まることにしてしまった。カプセルホテルが3000円、ネット付きホテルが4900円(朝食付き)ということを考えると、どうしても。
ライトニングトーク5分11枠、でも全部一人、みたいなっ!
青木さん、咳さんの本を買ってきた。6千円くらい。
セキュリティの大学院かー。どんな教育課程になるんだろう。
AOT コンパイラをどうやって効率的に使うか考えていたのだけれど、やっと答えが見つかったっぽい。
何に悩んでいたのかというと、呼び出しコストの問題。C メソッドとしてそのまま実行すると、例外が混ざっていたりすると、そのメソッド呼び出しごとに setjmp を発生させる必要が生じる。だから、あんまりうれしくない。
それ以外にももうちょっとなんかあるけど、まぁ、いいや。結局、部分 AOT みたいになるんかしらん。
basic block ごとにコンパイルして、各 basic block は ruby メソッド(YARV命令列)でつなげるって感じ。
拡張可能な YARV(VM一般)命令列というのを考えていたんだけど、あんまりいい考えが浮かばなかったので、結局 direct threaded code + call threaded code みたいな構成に。
拡張可能にしたければ、call threaded code だけでもいいような気はするんだけどね。
各 basic block は、
void basic_block_xxx(yarv_thread_t *th, yarv_control_frame_t *reg_cfp){ ...; }
こんな感じでコンパイルされる。
yarv 命令列は、
0: opt_call_basic_block basic_block_1 1: opt_call_basic_block basic_block_2 2: opt_call_basic_block basic_block_3
こんな感じ。例えばメソッド呼び出しとか、(他の要因がある)ジャンプ命令なんかは、その関数を抜ける。
って考えてるんだけど、どうだろうね。
p 1 p 2
というプログラムがあるとする。YARV 命令列にすると(だいたい)こうなる。
putself putobject 1 send :p, 1 pop putself putobject 2 send :p, 1 pop end
このプログラムは、p はたいてい C のメソッドだから、一度も AOTed な関数からは変える必要は無い。でも、もしかしたら、Ruby のメソッドかもしれない。
basic_block1(){ putself putobject 1 send :p, 1{ if p is ruby method pc = 1 return end } pop putself putobject 2 send :p, 1 pop end{ return } } basic_block2(){ pop putself putobject 2 send :p, 1 pop end{ return } }
という関数を作って、
0: opt_call_basic_block basic_block1 1: opt_call_basic_block basic_block2
こんなふうに YARV 命令列になる。
本当にこんな簡単でいいんだろうか。
しかし、この方法だとちょっと大きなプログラムでは関数が膨大になってしまうような気がする。多分無理やなぁ。プロファイルを取って、多分 C っぽい、ということがわかっている場合は試してみるのがいいかもしれない。
たとえば、メソッド呼び出しが n 個ある命令列の場合、n * (n + 1) / 2 倍にコードが膨れ上がってしまうんだなあ。
ある程度大きな連続した基本ブロックじゃないとコンパイルしない、というのも手か。
要するに、これは命令融合の次の一歩なんだね。
ところで、多値って結局どうするんだろう。
真の多値を導入しようと思うと、VMの構成はだいたいわかったんだけど、パーサの対応がどうなるのかわからない。
いや、VM の構成がわかってるってのは言いすぎデスね。
あと、文法がどうなるのかも不明。多値の利用方法が不明。多値を返す文法は return a, b, c でいいと思うんだけど、何に使うのか。多重代入の右辺値にしか使えないのならいいんだけど、たとえば引数として使ったとき、* でそれが展開するのか、とか。でも、* は Array に限定されてるから、もっと他の記号になるのかなぁ、とか。
def values return 1, 2, 3 end def m a, b, c p [a, b, c] end m(*values)
は可能なのか(今は配列なので可能)。
def values return [a, b, c], 1, 2 end def m a, b, c p [a, b, c] end m(*values)
だった場合、どうなるのかな、とか。まず、多値かどうかの判定をして、そうだったら、そうでなかったら、という文法になるんだろうか。複雑じゃなぁ。
そういえば OOPSLA ポスターの返事こねーなー。落ちちゃったかなぁ。
14ページの論文を40部刷っていかなきゃいけないんだよなぁ・・・。重そうだなあ・・・。
未踏、契約締結できたらしい。よかったよかった。
やっとスライドがあがった。
HOKKEですきーするとか。
世界中から来るんですねえ。韓国からも... http://wiki.rubykr.org/show/RubyConf2005