《シリーズ連載》言語処理系(TinyJavaインタプリタ)開発講座

ネットワーク上で開講!!

超高速インターネット環境の普及に伴って,クライアント側のCPUに依存しないプログラムの実行環境として, 再びインタープリタ技術の重要性が再認識されはじめています.この講座では,C言語仕様に類似した仕様をもつ 簡単なインタプリタ開発からはじまって,Javaに類似したオブジェクト指向インタプリタを開発できるまでの 技術,例えば言語仕様の設計方法や実行機構の作り方,開発の手順等を講義してゆきます.

サンプルとなるインタプリタプログラムを用いて解説しますので,短期間で独自の簡単なインタプリタが開発できるようになるはずです.
このような経験を通して,次のような点も一層深く理解できるようになるはずです.
質問はE-mailでいつでも受け付けますので,最後までがんばって受講してください.
なお,受講される方は,サンプルプログラム(C言語版,C++版)の送信の都合上,氏名とE-mailアドレスを下記まで連絡下さい.

E-mail: ohki@nit.ac.jp



1.インタプリタとは

インタプリタとは「高水準言語によるプログラムを, 仮想的なコンピュータ(仮想マシン)で 疑似的に動作させるような仕組みをもったプログラム」である.


インタプリタとコンパイラの最も大きな相違は,コンパイラが高水準プログラム(例えばC,C++,Java等) をCPUに依存するような機械語に翻訳し,実際にそのCPU上で実行させるのに対して,インタプリタはプログラムを 疑似コード(あるいはP-code: Pseudo-code)と呼ばれるCPUに依存しない命令コードに翻訳し,その疑似コードを 仮想マシンと呼ばれるプログラムが逐次評価・実行する. 
一般に仮想マシンがもつ演算機能や制御機能は, CやC++等のプログラミング言語を用いて記述される. そのため, 特定のCPUで稼働するCやC++のコンパイラが存在しさえすれば,疑似コードを評価・実行する仮想マシンのプログラムを コンパイラで機械語に翻訳し,実行することができる.実際,ほとんどのCPUにはCやC++等のコンパイラが用意されており, 仮想マシンの機能を記述したプログラムを,特定のCPUからそれ以外のCPUへ容易に移植できる(すなわち,異なるCPUで 稼働するコンパイラでコンパイルしなおせばよい)ことから,インタプリタを特定のCPUに依存しないで稼働させることが できる.このほかにも,インタプリタは必要に応じて,CPUから独立して自由に疑似コードを設計することができる長所をもつ.
以上に述べたインタプリタの基本的な動作環境を図示すると図2のように示すことができる.


仮想マシンの考え方は,複数の異なるアーキテクチャをもつコンピュータ上でプログラムを稼働させる機構として古くから 用いられており,最近のインターネットの普及によって,ハードウェアから独立してプログラムを稼働させる1つのレイヤ として,JavaやJavaScriptの疑似コードを実行する機構として取り入れられている.

2.基本的なモジュール構造と実現方法

インタプリタの機能は,図2で示した内容に対応して,図3で示すように大きく2つの機能から構成される. 1つはプログラムとして記述された文 / 式が構文規則(シンタックス)にしたがっているかをチェックすると同時に, 疑似コードに翻訳して,疑似コードテーブル(p_code_tbl)に格納する解析系(パーザ:Parser.以後こちらの呼び方を用いる) であり,他の1つは疑似コードテーブルから疑似コードを順次取り出し,それらを解釈してプログラム的に実行する評価系 (Evaluator)である.


3.インタプリタ機能の実現方法

3.1 パーザの構文規則チェック機能の実現方法

パーザの基本的な機能は,プログラムのソースコードを順次読み込み,それらが構文規則(シンタックス)に従っているかを チェックすると同時に,プログラムに対応する疑似コードを生成することにある. 1番目の機能である構文規則のチェック機能は,アプリケーション・プログラムをどのように記述するかをあらかじめ決めた 構文規則にしたがって,入力したソースプログラムが記述されているかを逐次チェックすればよい.このとき問題となるのが ,アプリケーション・プログラムの構文規則をどのような様式で表現するかであるが,ここでは,パーザのもつ解析手順と構文 規則を一対一に対応付けることが容易な構文図式(Syntax Diagram)を用いることにする.なお,構文図式を用いて構文規則を 記述するには,図4で示すような記述ルールにしたがう必要がある.