ひとり勉強会

ひとり楽しく勉強会

2006-11-10から1日間の記事一覧

まとめ

今日はこのへんで終わりにします。お疲れ様でした。次回は、飽きるまで延々とノードごとのコンパイル方法を眺めていこうかなと思っています。caseによる分岐や、イテレータを使ったループ、next/redoなどのループ制御が待ちかまえていて、だんだん複雑なゾー…

compile_branch_condition @ compile.c

「if文の条件を判定して、trueならthen側、falseならelse側にジャンプ」というマシン語を生成する処理は、関数が別にわかれています。 COMPILE_( nd_cond ) スタックから値をpopして、偽ならelse_labelにジャンプする命令のようにすれば、その場で簡単にコー…

node==nullの場合

elseのないif文も構文解析の段階でif-then-else文にまとめられる、と書きました。実はあんまりちゃんと追ってないのですが、elseがなかった場合はnd_else==0の構文木が作られているようです。 実は、switch文に入るより前にこういうコードがありました。 if …

NODE_IF

次はif-then-else文です。elseのないif文やunless文、三項演算子a?b:cも全部構文解析の段階でこのノードにまとめめられるので、コンパイラは1種類のif文だけ気にすれば済むわけです。コンパイルする処理はこうなっています。 case NODE_IF:{ DECL_ANCHOR(co…

NODE_BLOCK

お次は、NODE_BLOCK。RHG12章 の「幹」の説明を読んでみると、このノードは、文の並びをリストとしてつなぐためのノードです。細かいことは抜きにすると 7; 8; 9 という3つの文は NODE_BLOCK(nd_head: 文"7"を表すノード, nd_next: NODE_BLOCK(nd_head: 文"…

各ノードのコンパイル

この先はしばらく、switch文の各caseを順番に見ていきます。どの順番で読むと良いか特に妙案もありませんし、上からひたすら読んでいくとしましょう。飽きたら途中で考え直します。まず最初の4つのケースは、コンパイルエラーだそうです。 case NODE_METHOD…

poped 引数

なぜ突然スタックマシンの話を始めたかというと、実は、iseq_compile_each の第四引数を理解するのに必要だったからなのです。 iseq_compile_each(..., int poped) ざっと見た感じ、poped=0 で呼び出されている場合の方が多いようでした。そこで、特殊な方の…

スタックマシンとコンパイラ

YARVの仮想マシンは、YARV Maniacs 【第 2 回】 で解説されているように、「スタックマシン」という計算モデルで作られています。スタックマシンというのは、一本のスタック(末尾へのpushとpopだけができる配列)を考えて、そこへデータを入れたり出したり…

YARVソースコード勉強会 (3)

第3回です。今日はいよいよコンパイル処理の本陣に切り込みます。 コンパイルの大元締め関数はただひとつ、iseq_compile_each @ compile.c です。 static int iseq_compile_each(yarv_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) { ... type …