ほぼ出来た

LLVM化が、ほぼ出来ました。
OpenGLのプログラムがやっと動いた。

スタックにはレジスタ名と型をペアで突っ込むとよいみたいでした。
phi対応が面倒かった。
あと、基本ブロック対応のために、ラベルを関数が返すとかにした。
スタックマシンと似たようなコンパイル方法でも、それなりに行けました。
手抜きテストケースはとりあえずクリアしました。
コード出力部は大分圧縮出来ました。
OpenGLのプログラムが動かなくて、テストケース作らずに
とりあえず、動くようにゴリゴリ修正。
さらに、リファクタリング、switchの構文を変更。
最適化かかるので、コンパイル時間は倍くらいに増えたけどいいんです。
ll_emitの行数は、530行です。

発展

四則演算インタプリタ
四則演算スタックマシン→
四則演算PコードX86_64コンパイラ
longのみPコードX86_64コンパイラ
型付きPコードX86_64コンパイラ
longのみPコード→レジスタマシンLLVMコンパイラ
型付きLLVMコンパイラ→  <いまここ
型付きオブジェクト指向LLVMコンパイラ
型付きオブジェクト指向関数型LLVMコンパイラ
ジェネリックス付型付きオブジェクト指向関数型LLVMコンパイラ

コンパイル時間は長いかもしれませんが、奇麗なソースなので理解の助けになる事は間違いないです。
関数名短すぎて分からない問題はあるかもしれないですけど。。。

このコンパイラは多分最後まで、文法の問題が残ります。
ASTから先を出来るだけ速めに固めてしまって、文法でうんうん悩もうと思います。

なぜ、悩むのかと言うと演算子順位法だけで、やりたい事が出来そうにないからです。:を型を表す中置演算子とすると、ラベルとかswitch caseがぁあぁってなるわけです。若干の修正を許して貰えそうというのがなかなか見つからない訳で頭痛いです。パターンマッチがつけばおおってなるのかもしれないけど、、、。

パーサコンビネータなり、yaccで作った方が速いし自由だ。
だけど、演算子順位法だけで作れたら、とても美しいと言えると思うんだ。