はじめに
筆者が開発している日本語プログラミング言語コンパイラ「KMYsofts japanese」(以下、「KJ」と表記)のように、マクロアセンブラを使用したコンパイラの制作は、比較的簡単です。なぜなら、機械語のしがらみにとらわれず、英語を入力するだけでアセンブラが勝手に機械語に変換してくれるからです。
そこで本連載では、最近の日本語プログラミング言語の中で高いシェアを占める「なでしこ」を使用して、BASICライクな自作言語のコンパイラを作成します。多少マイナーな言語かと思われるため、初めての方でも簡単に作成できるように、なでしこの簡単な文法についても併せて説明します。
対象読者
技術レベルは特に問いませんが、なでしこの簡単な文法を前もって習得していることが望ましいです。「自分で作ったプログラミング言語でソフトを作りたい!」と考えている方も歓迎します。
また、プラットフォームはWindows XPを推奨します。MASMアセンブラ(後述)のインストーラが、現在Windows XP以降のWindows NT系OSでしか動作確認できていないからです。これは、インストーラの起動時に使うWin32APIがWindows 9x系OSにないため、Windows保護例外エラーが発生するのが原因です。MacOSやLinuxなどでは言うまでもなく動作しません。
作成するコンパイラの概要
これから作るコンパイラは、ソースコードをアセンブリ言語MASMのアセンブリに変換するものです。MASMとなでしこは、それぞれ無料で入手できます。また、同じ方法でコンパイルするKJは、ワイルドカードでプログラムを判別していますが、ここではコンパイラらしくトークン分割で判別することにします。
ソースコードは英語で記述します。BASICライクなものにしていきたいと考えています。プログラム言語名は、「Very Easy and Fool Basic Language」(とても簡単で変なBASIC言語)を略して「VEFBL」(ヴェフブル)と名づけます。
コンパイラの利点・欠点
コンパイラとは
そもそもコンパイラとはなんでしょうか。コンパイラは、人間に理解できるプログラミング言語で記述したプログラムを、コンピューターで実行できるように変換する仕組みで、いくつか種類があります。主な特徴は次のとおりです。
- 実行ファイルを作成してから実行する
- 実行ファイルのサイズが小さい、実行速度が速い
インタプリタとは
インタプリタは、コンパイラと同じようにプログラムを実行するためのソフトウェアです。インタプリタにもいくつかの種類があり、次のような特徴が主流です。
- ソースを分析しながら実行する
- 実行ファイルを作成できるものもあるが、作れてもサイズが大きく、実行速度が遅い
比較
コンパイラとインタプリタの2種類のプログラムを比較すると、下表のようになります。
コンパイラ | インタプリタ | |
実行ファイルの実行速度 | 速い | 遅い |
実行の手軽さ | コンパイルする手順が必要なため少し面倒(コマンドラインを使った場合) | プログラムを書けば、すぐに実行できる |
プログラムの読みやすさ | Win32APIをうまく呼び出すための宣言が必要となり読みにくくなりやすい | 開発言語自体で管理するため変数管理などが容易にできる |
それぞれ長所・短所がありますが、多くのインタプリタ言語は、「できるだけ多くの人が開発・実行しやすいように」という意図で作られています。統合開発環境さえ作れば、コンパイラでも手間ではないという意見にも一理ありますが、C言語(Borland C++ Compilier)など、コンパイルの前に設定が必要な場合も多々あります。
これから作るコンパイラは、できるだけそのような設定を省き、コマンドラインで簡単にコンパイルできるようにする予定です。
インタプリタには長所もたくさんありますが、一番気になるのが配布の時の実行ファイルのサイズです。各種サービスで提供されているホームページのスペースは容量制限があるものがほとんどで、最後の頼みのベクターでもダウンロードした人から「サイズが大きい」と苦情を言われかねません。その反面、コンパイラはその心配が少なくなります。
アセンブリとは
アセンブリについては、それ自体を知らないプログラマーもいると思いますので、説明を付け加えます。簡単に言うと、「個々の命令がコンピュータの一つ一つの行動に対応している低水準言語の一つ」です。
なお、「アセンブリ」には類似の語句があり、よく間違えやすいので整理しておきます。
- アセンブリ:コンピュータの一つ一つの行動を命令(テキスト)で表しているソースコード
- アセンブラ:アセンブリを機械語に変換するプログラム
- アセンブル:アセンブラを使ってアセンブリを機械語に変換する行為
「Hello Word!」を表示する
本稿で作成するプログラミング言語VEFBLで「Hello Word!」を表示するコードは、次の1行です。
Print "Hello Word!"; //コメント
実例からアセンブリの概要を学ぶ
今回はいきなりコンパイラを作成するのではなく、アセンブリの基礎部分を説明します。具体的なコンパイラの作成については、次回以降を予定しています。
説明には、本稿で作成するコンパイラと同様の機能を持つKJで生成したアセンブリの中から、必要な部分を抜き出したものを利用します。
また前述のように、本稿ではアセンブリ言語にMicrosoft社製の「MASM」(マスム)を使います。MASMの派生言語も出ていますが、本舗のMASMは経験豊富な人が作ったからか、使いやすい印象を受けます。