8-1. 高級言語と仮想機械の話
ここまでの話では、プログラム言語の処理系として、
インタープリタを作ることに専念してきた。
インタープリタはプログラムの意味を理解するために重要であり、
効率をさほど必要としない場合には、そのまま処理系として
利用されることもかなり多いが、やはり、
実行性能(速度)が重要になってくる場合には、コンパイラが欲しくなる。
そこで、2012年度から、本実験でも、簡単なコンパイラを書くことにした。
コンパイラは、通常、高級言語(今回の場合はミニOCaml言語)から
一種の機械語への変換するものである。
通常は、単に変換するだけでなく、実行速度向上のための種々の
効率化(最適化と言う)を適用することを含めるが、ここでは、
変換部分のみを作成し、最適化については発展課題とする。
なお、関数型プログラム言語は、
決してインタープリタを書くことだけが得意なのではなく、
構造をもったデータ(不定長のデータ、数式、論理式、XMLデータ、プログラムなど)の処理全般が得意である。
やるべき事を整理しよう。
- 既に作ったインタープリタ :
高級言語(ミニOCaml言語、または、それの拡張)のプログラムを与えられた時、
それを実行し、結果を返すプログラムである。
高級言語の意味を理解するためには非常に適している。
与えられた式のうち、「次に計算する部分」を探して逐一解釈して(match文により、
どの種類の式かを判別して)、処理を行なうので、
特に、再帰呼び出しを1000回繰返すような処理では、実行速度が遅い。
- これから作るコンパイラ :
高級言語(ミニOCaml言語、または、それの拡張)のプログラムを与えられた時、
それを別の言語(ターゲット言語)のプログラムに変換するプログラムである。
得られたプログラムは、別途、実行される。
ターゲット言語は、機械語、仮想的な機械語、他の高級言語など様々である。
- 最適化コンパイラ: 多くのコンパイラは、言語間の変換をするだけでなく、
静的情報を利用して実行速度の向上を図るための様々な工夫を行っており、
これを最適化と言う。最適化するコンパイラを特に「最適化コンパイラ」と呼ぶ
こともある。
本実験は、最適化による速度向上を狙いとしたものではないので、
最適化は(基本的には)行わず、「言語間の変換」だけを行なう。
- コンパイラのターゲット言語:
高速な実行を意図したコンパイラは、ターゲット言語が機械語(CPUで直接実行できるもの)
であることが多いが、本実験では、特定のCPUに依存させないため、
「仮想的な機械」の上で走る機械語をターゲット言語とする。
この仮想的な機械は、直接、IntelなどのCPUでは動かないので、
「仮想的な機械語」を実行するためのインタープリタが必要である。
若干、話が込みいってきたが、ここでの話は、Javaのコンパイラによく似ている。
- javac: Javaプログラムを JVM(Java仮想機械)の機械語のプログラムに変換する。
- java: JVM(Java仮想機械)の機械語で書かれたプログラムを実行する。
本実験では、2つ目のjava に相当する部分は教材として提供し、
1つ目のjavac に相当する部分を学生が作成する。
トップ,
前へ,
次へ.
亀山幸義