連載
» 2006年12月02日 00時00分 公開

Javaでコンパイラの基礎を理解する(1):そもそもコンパイラの中ってどうなっているの? (2/2)

[小山博史,株式会社ガリレオ]
前のページへ 1|2       

コンパイラの基本構成

 さて、今回はコンパイラの基本構成について確認をしておきます。コンパイラは、入力としてソースコードを受け取り、内部で変換処理を行いオブジェクトコードを出力するプログラムです(図1)。ソースコードは、人間が理解しやすいプログラミング言語で記述されたものであり、オブジェクトコードは、コンピュータが理解しやすい2進数の羅列である機械語で構成されています。

 Javaの場合は、ソースコードはプログラミング言語Javaの文法で書かれたコードが記述されたもの(.javaファイル)であり、オブジェクトコードはJavaVM用の機械語で書かれたクラスファイル(.classファイル)が相当します。

図1 コンパイラ 図1 コンパイラ

 さて、ここでJavaのような仮想計算機用のプログラミング言語について見てみましょう。

 Javaの場合には、Javaコンパイラによって出力されるオブジェクトコードは仮想計算機のJavaVM用の機械語で書かれたものになります。JavaVMはさまざまなOS用に提供されているので、Javaのプログラムは、1つのOSを対象とするプログラムよりも多くのOSをサポートすることができます。ただし、JavaVMをインストールしておかないと、実行することはできません。

編集部注:JavaVMについての詳細は、「チューニングのためのJavaVM講座」を参照してください。

 基本的にOSから見るとJavaVMはJavaVM用の機械語を逐次実行するインタプリタになりますから、Javaのプログラムはインタプリタ実行されるということになります。

図2 JavaのコンパイラとVM 図2 JavaのコンパイラとVM

コラム OSと仮想計算機

OSというのは、コンピュータハードウェアの差を吸収し、共通的な機能をアプリケーションやユーザーへ効率よく提供するといった目的で作られたものです。ところが、複数のOSが普及したことによって、今度は各OSの差を吸収するものが必要となってきたため、仮想計算機が考案されたということができます。では、複数の仮想計算機が普及するようになるとどうなるのでしょう。それらの差を吸収するための仮想計算機用OSが出現することも考えられます。このようなOSは、筆者が知らないだけで、実はすでに世の中にあるかもしれません。しかし、どこまで仮想化の階層が増えるのかと、何だか変な気がします。


 次に、コンパイラの内部処理について説明をします。コンパイラでは、[字句解析][構文解析][意味解析][コード最適化][コード生成]といったフェイズに分かれていて、順に処理が進みます。このとき、途中段階の各フェイズでは中間コードを使ってプログラムを表現することもあります。

 また、プログラム上の変数や関数の名前などを保存する名前表なども必要になります。次の図では、中間コード、名前表などを中間情報としています。

図3 コンパイラの基本構成 図3 コンパイラの基本構成
  1. 字句解析]では、「public class A { int a; }」といったJavaのソースコードに含まれる文字列を「public」「class」「A」のように、字句という単位に分割します。
  2. 構文解析]では、文法的に正しいかをチェックします。例えば、「public clas A { int a; }」とJavaのソースコードがなっていると、「clas」の位置には「class」や「interface」が来るはずなので、構文的に間違っている、ということでエラーにします。
  3. 意味解析]では、実行できるかをチェックします。例えば、「a = b;」は構文的には合っていますが、 a が int型の変数で b がboolean型の変数の場合は代入ができませんから、意味的に間違っている、ということでエラーにします。
  4. コード最適化]では、実行時により速く実行できるように無駄をなくしたり、オブジェクトコードのサイズをできるだけ小さくするように無駄をなくす処理をします。
  5. コード生成]では、その名のとおりオブジェクトコードを生成します。

おわりに

 さて、今回はコンパイラの基本構成について簡単に説明をしました。各処理の詳細については、連載の各回にて解説する予定です。

 また、スタックというデータ構造についても理解しておくことも必要なので、これについても解説をします。

 コンパイラを作成するに当たって非常に基礎的な部分を解説しますので、いままでコンパイラに興味はあったけど専門書を読むところまではできなかった開発者にとって役に立つ記事になれば、と考えています。お楽しみに。

筆者紹介

ガリレオ

小山博史(こやま ひろし)

Webシステムの運用と開発、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。Ja-Jakartaプロジェクトへ参加し、コミッタの一員として活動を支えている。また、長野県の地域コミュニティである、SSS(G)bugs(J)の活動へも参加している。



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。