簡単な仮想計算機を作ろう(実装編):Javaでコンパイラの基礎を理解する(3)(3/3 ページ)
教育界、技術者コミュニティでJava言語の教育と啓蒙に長年携わってきた筆者が、Javaを通してコンパイラの仕組みを分かりやすく紹介する。(編集部)
いよいよ仮想スタックマシンを動かす!
さて、実際に仮想スタックマシンを動作させるためには、専用のプログラムコードが必要になります。つまり、Svm1用のオブジェクトコードを作成する必要があるわけです。本来は、そのコードは計算式の文字列からSvm1用コンパイラを使って生成することになります。しかし、まだコンパイラは作成していないので、この方法を採用することはできません。
オブジェクトコードをJavaで書き出しするプログラム
バイナリエディタで直接ファイルを作成する方法もありますが、ここでは例で示したサンプルのオブジェクトコードをJavaで書き出しするプログラムを記述することにします。プログラムはバイトの2次元配列で用意しておき、code0.svm、code1.svm、code2.svmというファイル名で保存することにします。
処理自体は、配列codeに用意したオブジェクトコードをファイルへ書き出すだけの処理なので、説明は省略します。最後に付けたプログラムを参照してもらえば分かるはずです。
使い方は単純で、次のようにコンパイルをしてから実行するだけです。これで、code0.svm、code1.svm、code2.svmというファイルが書き出され、それぞれに Svm1用のオブジェクトコードが保存されます。
> javac SampleSvm1CodeGenerator.java > java SampleSvm1CodeGenerator
仮想計算機もどきの実行!
SampleSvm1CodeGenerator.javaは、次に示すオブジェクトコードを持つプログラムを生成します。上から順に、code0.svm、code1.svm、code2.svmに対応しています。
このプログラムで生成されたSvm1のオブジェクトコードを仮想スタックマシンSvm1で実行します。
code0.svmには、「1 + 2」、code1.svmには、「1 + 2 * 3」、code2.svmには、「(1 + 2) * 3」を計算するオブジェクトコードが保存されていますから、実行結果はそれぞれ「3」、「7」、「9」となります。
> java Svm1 code0.svm 3 > java Svm1 code1.svm 7 > java Svm1 code2.svm 9
仮想計算機もどきの実行例をイメージで表すと……
code1.svmのプログラム「16|1|16|2|16|3|104|96|-48」を例に、どのように動作しているのか確認をしてみましょう。ソースコードSvm1.javaと照らし合わせながら、次の図5をよく確認してみてください。オペランドスタックは横に倒して表していますので注意してください。
最初に、「16」を読み込むとbipushの命令と判断し、次の1byteを読み込んでオペランドスタックへ「1」をpushしています。同様にして、「2」「3」をpushします(図では、省略しています)。
「104」を読み込むと、オペランドスタックから値を2つpopして、それらを乗算し、その結果をオペランドスタックへpushします。
「96」を読み込むと、オペランドスタックから値を2つpopして、それらを加算し、その結果をオペランドスタックへpushします。
どうでしょう、スタックを使うと簡単に仮想計算機をソフトウェアで実装することが分かったでしょうか。もちろん、Svm1は仮想計算機というには機能が少な過ぎますが、雰囲気はつかんでいただけたと思います。
次回は、プログラミング言語の文法について
さて、これまでの解説で、式を後置記法で表現することにより、コンピュータがプログラムを実行しやすくなること、また、これを計算評価する仮想スタックマシンが簡単に作成できることが理解できたはずです。
これで、コンパイラが出力するオブジェクトコードについてのイメージは固まったので、次はコンパイラへ入力するソースコードについて考えることにしましょう。
間違った式を入力した場合には、コンパイラはエラーを出して、ユーザーへそれを教える必要があります。次回は、そういった動作を実装するために必要な、プログラミング言語の
文法について解説する予定です。お楽しみに。
参考文献
▼『オートマトン・言語理論の基礎』 近代科学社
▼『JAVAバーチャルマシン』 オライリー・ジャパン
▼『プログラミング言語Java』 ピアソンエデュケーション
▼『The Java Language Specification, Third Edition』 Addison - Wesley
▼『JAVAによるパーサ構築技法』 ピアソンエデュケーション
▼『オブジェクト指向における再利用のためのデザインパターン』 ソフトバンク パブリッシング
▼『Java言語で学ぶデザインパターン入門』 ソフトバンク パブリッシング
▼『JavaCCーコンパイラ・コンパイラ for Java』 テクノプレス
▼『スモールコンパイラの制作で学ぶプログラムの仕組み』 技術評論社
▼『コンパイラ入門』 ソフトバンククリエイティブ
今回のソース
ここからダウンロードできます。
筆者紹介
小山博史(こやま ひろし)
Webシステムの運用と開発、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。Ja-Jakartaプロジェクトへ参加し、コミッタの一員として活動を支えている。また、長野県の地域コミュニティである、SSS(G)やbugs(J)の活動へも参加している。
Copyright © ITmedia, Inc. All Rights Reserved.