この実験ではML言語のサブセットであるMiniML言語のコンパイラを作成する.MiniMLの言語仕様の詳細については改めて言語仕様で説明するが,基本的には,講義「プログラミング言語処理系」および「計算機科学実験及び演習3 ソフトウェア」の中で扱ったML言語に対し少しばかりの機能を追加したものである.たとえば,次は正しいMiniMLのプログラムである.
let multiplicand = 8 in
let rec multiply8 = fun n ->
if n < 1 then
0
else
multiplicand + multiply8 (n+-1)
in
let apply = fun f -> fun x -> f x in
apply multiply8 9;;
この(かなり作為的な)プログラムでは,関数を値として扱い(multiply8
),また,関数本体からはその外側の環境で宣言されている変数を参照している(multiplicand
やf
).関数型言語の高水準な機能を使っているこのようなプログラムを,より単純で低水準な機能しか持ち合わせていない機械語へ変換するコンパイラを実現することが,この実験の目標である.
Note: この実験でつくるコンパイラでは,正確にはアセンブリ言語までの変換を行う.以降,機械語とアセンブリ言語をあまり区別せず書くことがある.
また,コンパイラが生成する機械語コードの実行性能を実感し,性能向上のための種々のコード最適化手法を学ぶのも実験の目的である.そのため,MiniMLコンパイラが出力する実行ファイルの動作確認には,ハードウェア・シミュレータなどではなく実機のRaspberry Pi 3を使用することにする.
Note: 一般的なPCに搭載されているIntel系CPUの命令セットアーキテクチャは,授業で学んだMIPSアーキテクチャと比べかなり煩雑なため,この実験では対象としていない.MIPSと似たアーキテクチャのARMを搭載し,なおかつ入手がたやすいという理由により,Raspberry Pi 3を用いることにしている.