さて、今回はコンパイラの基本構成について確認をしておきます。コンパイラは、入力としてソースコードを受け取り、内部で変換処理を行いオブジェクトコードを出力するプログラムです(図1)。ソースコードは、人間が理解しやすいプログラミング言語で記述されたものであり、オブジェクトコードは、コンピュータが理解しやすい2進数の羅列である機械語で構成されています。
Javaの場合は、ソースコードはプログラミング言語Javaの文法で書かれたコードが記述されたもの(.javaファイル)であり、オブジェクトコードはJavaVM用の機械語で書かれたクラスファイル(.classファイル)が相当します。
さて、ここでJavaのような仮想計算機用のプログラミング言語について見てみましょう。
Javaの場合には、Javaコンパイラによって出力されるオブジェクトコードは仮想計算機のJavaVM用の機械語で書かれたものになります。JavaVMはさまざまなOS用に提供されているので、Javaのプログラムは、1つのOSを対象とするプログラムよりも多くのOSをサポートすることができます。ただし、JavaVMをインストールしておかないと、実行することはできません。
基本的にOSから見るとJavaVMはJavaVM用の機械語を逐次実行するインタプリタになりますから、Javaのプログラムはインタプリタ実行されるということになります。
OSというのは、コンピュータハードウェアの差を吸収し、共通的な機能をアプリケーションやユーザーへ効率よく提供するといった目的で作られたものです。ところが、複数のOSが普及したことによって、今度は各OSの差を吸収するものが必要となってきたため、仮想計算機が考案されたということができます。では、複数の仮想計算機が普及するようになるとどうなるのでしょう。それらの差を吸収するための仮想計算機用OSが出現することも考えられます。このようなOSは、筆者が知らないだけで、実はすでに世の中にあるかもしれません。しかし、どこまで仮想化の階層が増えるのかと、何だか変な気がします。
次に、コンパイラの内部処理について説明をします。コンパイラでは、[字句解析][構文解析][意味解析][コード最適化][コード生成]といったフェイズに分かれていて、順に処理が進みます。このとき、途中段階の各フェイズでは中間コードを使ってプログラムを表現することもあります。
また、プログラム上の変数や関数の名前などを保存する名前表なども必要になります。次の図では、中間コード、名前表などを中間情報としています。
さて、今回はコンパイラの基本構成について簡単に説明をしました。各処理の詳細については、連載の各回にて解説する予定です。
また、スタックというデータ構造についても理解しておくことも必要なので、これについても解説をします。
コンパイラを作成するに当たって非常に基礎的な部分を解説しますので、いままでコンパイラに興味はあったけど専門書を読むところまではできなかった開発者にとって役に立つ記事になれば、と考えています。お楽しみに。
小山博史(こやま ひろし)
Webシステムの運用と開発、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。Ja-Jakartaプロジェクトへ参加し、コミッタの一員として活動を支えている。また、長野県の地域コミュニティである、SSS(G)やbugs(J)の活動へも参加している。
Copyright © ITmedia, Inc. All Rights Reserved.