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

教育界、技術者コミュニティでJava言語の教育と啓蒙に長年携わってきた筆者が、Javaを通してコンパイラの仕組みを分かりやすく紹介する。(編集部)

» 2006年12月02日 00時00分 公開
[小山博史株式会社ガリレオ]

プログラミング言語処理系の実装

 Ajaxなどによりスクリプト言語のJavaScriptの良さが見直されたり、Railsの出現によりプログラミング言語Rubyへの注目度が高まったりしています。これだけプログラミング言語が注目されるようになってくると、独自のプログラミング言語を作成したいと考える開発者も増えてきていることかと思います。

編集部注:Ajaxについては、@IT リッチクライアント&帳票 フォーラムを、Ruby on Railsについては、「特別企画 Javaから見たRuby on Rails」参照してください。

 そのためには、プログラミング言語処理系を実装する技術を理解する必要がありますが、一番の早道は簡単なコンパイラを作成してみることです。そこで、本連載では、プログラミング言語Javaを使って、プログラミング言語処理系の実装に関する基礎について紹介します。

編集部注:本連載ではプログラミング言語Javaの基本については理解していて、コンパイラ作成に興味を持っている読者の方を想定しています。プログラミング言語Javaの基本については、「Eclipseではじめるプログラミング」「EclipseでJavaに強くなる」といった記事などを参照してください。

コンパイラ作成を勧める3つの理由

 Javaなどのプログラミング言語を使えるようになって、自分が作りたいプログラムを自由に作成できるようになってくると、既存のソフトウェアでも簡単なものを自作してみたくなるものです。せっかくプログラムを組めるようになったのですから、いろいろと自分で作ってみたいと思うのは当然です。中でも、プログラミング言語処理系は一度は作成してみたいと思うでしょう。

 一般のコンピュータ利用者と違って、開発者は日ごろからコンパイラやインタプリタを使っていますから、その動作原理や仕組みについて興味を持つのは当たり前です。しかし、プログラミング言語処理系の実装をする機会というのはそれほど多くないので、実際に作成してみることは少ないのではないかと思います。

 世の中にはよくできたプログラミング言語処理系もたくさんありますから、わざわざ自作する必要性を感じない人もいるかもしれません。そこで、読者の皆さんへプログラミング処理系の1つであるコンパイラの作成を勧める3つの理由を最初に述べておきます。

(1) プログラミング言語処理系の理解が深まる

 プログラミング言語処理系には「インタプリタ」と「トランスレータ(コンパイラやアセンブラ)」がありますが、インタプリタは同時通訳でトランスレータは翻訳のようなものとよく説明されます。

 この比喩(ひゆ)は非常に直感的に理解できるものなのですが、実際にインタプリタとトランスレータではどんな違いがあるのかを、プログラミング言語処理系の実装をしたことがないまま、きちんと説明するのは難しいです。

 しかし、実際に簡単な処理系を作成してみると、どんな処理をどのような順番でコンパイラは行っているのか、具体的に理解できるようになります。すると、インタプリタとトランスレータの具体的な利点、欠点、差異といったものについて自然と分かるようになります。

 また、プログラミング言語処理系は特殊な分野ですから、使う技術が特別だという点も魅力的です。非常に簡単なインタプリタやトランスレータでも、作れるようになっていれば、純粋にプログラミング技術力アップにつながりますから、いつかどこかで役に立つことがあるはずです。

(2) プログラムとコンピュータの関係について理解が深まる

 プログラミング言語処理系は人間とコンピュータとの間で橋渡しの役割を担っています。コンパイラは人間が理解しやすい高水準プログラミング言語を、コンピュータが理解しやすい機械語へ変換しますから、この処理を記述するためには、両方についての深い知見が必要になります。

 これまでは、プログラミング言語の文法は、「なぜこのように書くことになっているのか」を深く理解しなくても、「文法で決まっているからそのとおりに書けばいい」という程度の姿勢で記述することができました。

 しかし、プログラミング言語処理系を実装するに当たっては、文法も自分で定義する必要がありますから、文法の定義の仕方から考えないといけません。そうやって文法を定義するところからやってみると、自然とこれまで以上にプログラムとコンピュータの関係について理解が深まります。

(3) 独自プログラミング言語の開発ができるようになる

 汎用的なプログラミング言語を開発するのは大変ですが、特殊な分野に限定したプログラミング言語への要望は高まっています。インターネットの普及と同時にパーソナルコンピュータの普及率も高まり、これまで以上にいろいろな分野の作業でコンピュータが使われるようになっています。

 例えば、コンピュータプログラミングを教える教育分野では、「ドリトル」などの数多くのプログラミング初学者向け言語が提案されて研究されています。ほかの分野でも同じように、自分が担当している作業を実施するのに適したプログラミング言語を開発できれば、大幅な業務改善が可能になるはずです。

 次期Java(Java SE 6.0(開発コード名:Mustang))には、scripting frameworkも用意されますから、開発した独自のスクリプト言語を対応させて公開するだけで、Javaから自由に使えるようになります。この点からも、独自プログラミング言語の開発ができるようになると楽しいことが増えそうです。

編集部注:scripting frameworkについては、「コラム JavaとJavaScriptの親しい関係」を参照してください。

 以上、3つの理由を述べましたが、筆者がコンパイラに興味を持った大きな理由は、単に「面白そうだから」でした。専門書をじっくり腰を据えて読んで作成するということもできますが、まずは非常に簡単なレベルのものでも一度作ってみると、その面白さが分かるはずですし、次のステップへも進みやすくなります。

 そこで、本連載ではコンパイラの入門レベルの内容を解説し、読者の皆さんが、これまでちょっと近寄り難かったコンパイラの専門書を読むことができるようになることを目標とします。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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