8-2. 仮想機械

コンパイラ作成にあたって、 最初に決めるべきは、どのような言語のプログラムに変換するかである。 この「行き先の言語」をターゲット言語と言う。

Java では通常、JVM (Java Virtual Macihne) と呼ばれる抽象化された(実在しない)機械の上で動く機械語がターゲット言語である。 この場合、実在のハードウェアでそのまま実行できないので、 JVM を動かすためのインタープリタを用意する。 Intelだろうと他のCPUだろうと、 このインタープリタさえ用意すれば、 (Javaコンパイラ自身は作り変えることなく)、 どのようなマシンでも動かすことができる。

実は OCaml も、普通にコンパイルすると、 本当の機械語 (Intel x86 の機械語など)のプログラムへ変換されるのではなく、 OCaml 用の仮想機械の機械語に変換される。 その仮想機械のインタープリタが、 コンパイルされた(仮想的な)機械語のプログラムを実行している。 (もっとも、OCaml でも Java でも、 本当の機械語に変換するコンパイラも存在しており、native compiler と呼ぶ。 通常は、native compiler でコンパイルしたプログラムの方が、 仮想機械のプログラムよりも高速に動作する。 その2つの実行速度の差は、大きいこともあるし、 ほとんどないこともある(プログラムの性質による)。

ごちゃごちゃ書いてきたが、今回の実験でのコンパイルは、 最適化を(ほとんど)やらないので、 ターゲット言語は、本当の機械語ではなく、 もう少し抽象的なレベルの仮想的な機械でよい。 このような機械を、仮想機械(virtual machine) と言う。 (なお、抽象機械(abstract machine)という言葉もあり、 プログラム言語の理論では「抽象機械」の方をよく使う。 両者は似ているが、若干異なる言葉であり、ここでは「仮想機械」という。) 仮想機械の侯補も非常に多数のものがあるが (JVM のほか、LLVM など) ここでは、コンパイル方式を理解するという目的のため、 Caml light (OCaml の前身の言語)で使われた ZINC機械を採用する。

(ZINC仮想機械の説明をここに書く。)


トップ, 前へ, 次へ.

亀山幸義