{% include head.html %}
本章ではMiniML4言語のサブセットからMIPSアセンブリへのコンパイラの設計について解説する.このサブセットを MiniML4- と呼ぶことにしよう.コンパイラは,概論的な話で言及した通り,ソース言語のプログラムを同じ振る舞いをするターゲット言語のプログラムに変換するソフトウェアである.本章で設計するコンパイラでは,ソース言語がMiniML4-,ターゲット言語がMIPSアセンブリということになる.生成されたMIPSアセンブリを世の中にあるアセンブラで実行可能バイナリにさらに変換することにより,MiniML4- プログラムをMIPSアーキテクチャの計算機やシミュレータで動かすことが可能になる.なお,本章ではMIPSアセンブリの知識を(できるだけ) 仮定せずに読めるように書いたつもりである.(コンパイラの最後のフェーズではさすがにMIPSアセンブリの知識が必要になるんだけれども.)
一般的にコンパイラはソースプログラムを一度にターゲット言語に変換するのではなく,その間に幾つかの言語を挟んで,徐々にターゲット言語への変換を行う.間に挟まれるこれらの言語を 中間言語 (intermediate language) と呼ぶ.このように設計することの利点は以下の通りである.
- 徐々に中間言語をターゲット言語に近づけることで,各変換がわかりやすくなる.例えば,高階関数やオブジェクト指向や◯◯指向やらがたくさん入った言語で書かれたプログラムを一気にアセンブリに落とすよりは,徐々にアセンブリに近づけていく方が変換が分かりやすいし実装も容易である.
- 新しい言語を設計したときに,中間言語を再利用することができる.すなわち,中間言語$I$を作り,$I$からアセンブリへの変換を作ってしまえば,将来別のプログラミング言語$L$のコンパイラを作る際に,コンパイラ全体を実装する必要はなく,$L$から$I$への変換を実装するだけでよい.
等がある.
本章で設計するコンパイラでは,二つの中間言語を置く.一つ目は MiniML4- プログラムで明示されていない式の評価順序等の情報を明示した関数型言語,もう一つはMIPSアセンブリにより近い命令形言語である.名前があったほうが教科書を書きやすいので,前者を言語$\mathcal{C}$,後者を言語$\mathcal{V}$と呼ぶことにしよう.また,ターゲット言語であるMIPSアセンブリを言語$\mathcal{A}$と呼ぶことにする.(TODO: 図)
なお,本章で解説するコンパイラは東北大学の住井英二郎氏の MinCaml コンパイラ からつまみ食いをしたものになっている.MinCaml はOCaml さえ読めればとても分かりやすいミニコンパイラになっているので,できればそっちも読んでほしい.また,高階関数型言語ではないが,植山類氏の低レイヤを知りたい人のためのCコンパイラ作成入門 は C コンパイラの優れた教材のようである.(まだ末永はちゃんと読んでいない.)
また,本教科書に基づくコンパイラを馬谷誠二氏が実装しているので参考にされたい.