VMについてのyak shaving

分からない単語を知ったかぶりして読んでると大変なことになるのは確定的に明らか。ということで、最近読んだ VM の本 - steps to phantasienを読んでてbasic blockという単語が分からなかったので調べてみることに。

まずはWikipedia。文章がほとんどオーガナイズされてないので分かりにくいですが、分岐などが無い、ストレートなコードのブロックのことだそうです。具体的には下記みたいな。

a = 4;
b = 10;
c = a * b;

どちらかというと、高級言語よりもアセンブラなどの低級言語のほうがブロックを理解するには簡単かもしれません。ジャンプ系とか入ってくればそれで終わるので。下のほうにある外部リンクからGCCのページを見ると具体的な話が出てきます。

なるほど、basic_blockが双方向リンクリストでずらずらとつながるのか。で、これを使って何を表現するのかというと、treeかRTLを表すのに使うそうです……って、また知らない単語が。RTLとかアラビア文字(BIDI的な意味で)ですか?ってぐらい無知です。

同じくGCCのドキュメントを参照したところ、10 RTL Representationという項目がありました。概要を読んだだけだと「命令の動作を代数的な形で表したもの……」って、よく分かりません。Lispにインスパイアされたとかなんとか。確かにRegs and MemoryとかArithmetricとかを見てるとそんな感じはしますね。

全部読んでると大変そうなので、とりあえずはGCCが使うコード内部表現ということで簡単に理解しておくことにしました。最初に知ったかぶりはイカンと言ったわりに適当です。もう片方のtreeについても9 Trees: The intermediate representation used by the C and C++ front endsという形で書かれているようです。こっちは割と直感的に想像できる、ソースコードのツリー構造ということでいいみたいです。

treeはcoretypes.hでtree_node*のtypedefとして定義されていて、tree_nodeはtree.hで定義されています。定義といっても激しいunionなんですが。

なんだか終わりが見えなくなってきたのでこれぐらいで止めておきますが、結論としてある程度レベルの高い記事を読むためには前提知識を詰め込むだけで大変だということですね。ま、こうやってコード追っかけるのもなかなか楽しかったです。