コンパイラの基盤技術と実践-コンパイラ・インフラストラクチャCOINSを用いて-(ISBN:9784254121735)

よんだ。なるほど、だいたいわかった。しかし、COINS自体はプロジェクトとして非常に有用でも、コンパイラの教科書としては問題ないか、これ?
スタックフレームと局所変数の話や、data領域、text領域に対する説明がHIRレベルで全くないような・・。その辺はすでに学んでいるものとして進めてるのかな? 一番ページを割いているのが最適化というのもなんか不思議。いや、コンパイラ作ってると一番時間かかるのは確かに最適化なんだけど(また、楽しいんだよね。結果が目に見えるし、ソフトウェアでハードウェアの制限を超えていく気分がして)、コンパイラとしては些末な技術のような。asm,linkをgnu-binutilsに頼っているので詳しいことはかけないにしても、ld,so,o,elf周りの話を抜きにしてコンパイラを作るととんでもないところで落とし穴に落ちそうな、そんな感じ(「え?リエントラントって何ですか?」とか)。これを読む人は、あらかじめ

あたりを読んでおいた方がいいかも。
あと、LIRは言うに及ばずHIRはJavaVMやCLR,Smalltalkなんかの「オブジェクトありき」のVMじゃないのでランタイム周りはちょっと覚悟がいるな。継承によるメソッド呼び出しチェーンや参照とガベージコレクトなんかは別途Cのライブラリとして組んでおいて最後にリンクするのが正しいんだろうな。
GCJもかなりその辺無理して動かしてるので(なので、あんまりGCJ信頼性無い。AOTだから速いだろうなんて言う人いるけど、下手するとIcedTeaの方が速かったりする。いわんやHotSpotをや)、なるべく手間のかからない方向でランタイム作らないと。
とりあえず、

  1. Javaソースを用意
  2. Javacでコンパイル
  3. classファイルをJavapでバイトコードレベルの出力を受け取る
  4. Javap出力をJavaCCとJJTreeでパージング
  5. メソッドとコンストラクタ、スタティックイニシャライザを「パッケージ名_クラス名_メソッド名」のラベルとしてHIRのルーチンに
  6. メソッド名|フィールド名+「HIRのラベル」を対にしてテーブルにする
  7. 「パッケージ名_クラス名」のラベルとして、クラスローダをHIRのルーチンに
  8. HIRtoCでCのソースに落とし込む

ってのが大まかな流れかな。C++をどこにも介在させないのがミソね。C++の「クラス」とJavaの「クラス」って記述方法が似ている以外はあんまり共通性無いので。
一端バイトコードを介するのは、Javaってじつは「暗黙的なコード」がソース内にたくさん隠れてるから。ダイナミックイニシャライザとか、配列の初期化子とか、フィールドの初期値とか。バイトコードに落とし込むとこの辺見えるんだよね。
ある程度できたら、javapを使わないクラスファイルローダに差し替えるとターンアラウンドタイムが減っていい感じかな。
HIRtoCにプロトタイプ宣言をはき出すヘッダファイルがないのが気になるけど、そこは自前で作るか。あと、data領域を暗黙的に使わないよう監視しておかないと。


・・うーん。やっぱりバイトコード解釈するJavaVMの方が工数かかんない気がするなー。
ま、いいや。客には逆らえないってことで。ネイティブコードになってれば文句言われないだろう。