こんな処理系を作りたかった
BisonやFlexを使って、言語処理系の土台となる字句解析処理や構文解析処理を 簡潔に記述できるようになりました。
あとは、変数や型の処理、分岐、関数呼び出しといった、 言語の意味的な機能と、実行コードを生成する部分を、CやC++で記述すれば、 インタープリタやコンパイラなどの本格的な言語処理系が作れるようになります。
実はこれらの処理は、言語仕様を縮小することで、非常に簡単に記述することができます。 特に変数名の長さや、変数の個数、実行時に使用可能な記憶領域の大きさを、決め打ち (つまりは単純に配列として実装する)したり、 型に関する処理、スコープ(※)に関する処理を省くことで、言語の意味的な機能に関わる実装上の複雑さを、 かなり軽減することができるのです。
実際、BisonやFlexなどの使い方を解説している本に掲載されているサンプルには、 こうした処理を端折ることで、コードを短くしているものが多く見あたります。
しかし、こうしたサンプルの処理系が扱えるプログラミング言語は、見た目としては高級言語らしく、綺麗な ソースコードを書くことができるのですが、機能の面ではとても満足のできるレベルではありません。
例えば、使用できる変数の数や、変数名の長さなどを制限すれば、それだけプログラムを記述する側で 余計な配慮をする必要が出てきます。変数名の最初の5文字以降が勝手にカット されるような言語仕様では、変数名の重複といった誤りを誘発してしまいます。
もっと大切な問題は、何らかの目的を持った処理を、人間にとって 分りやすい形でコンピュータに指示するという、言語処理系を使うそもそもの目的に由来します。 その目的は画像処理だったり、金額計算だったり、ゲームプログラミングだったりしますが、 大抵は満足の行く機能性を 得るために、多くの機能や手続きを使った複雑な処理を作ることが必要になってきます。
このため型や関数、オブジェクト指向機能、その他の合目的性を持った機能、より高度に抽象化/自動化された機能を 記述するための手段を導入しなければ、 プログラミング言語は「便利に使える」というものにはなり得ません。

そこで今度は「使える」レベルを目指して処理系を作ることにしました。 現在このホームページでダウンロード可能な「へたれBASIC」です。
この処理系の作成に当たって、幾つかの方針を考えました。
一つは、N88−BASICに似た言語仕様にするということです。 この言語はNECの往年のパソコン、PC―88/98シリーズに搭載されていたBASICインタープリタです。 比較的シンプルな仕様の言語ですが、画面描画やファイル入出力など、色々な指示を簡単に記述できます。 昔はこれで事務処理やツール類、ゲームなど、かなり込入ったプログラムも記述していたものです。
もう一つはある程度複雑な処理の記述にも耐えうる データ構造の柔軟な表現機能を導入することです。というか「」を扱えるようにします。 取合えず整数型と文字列型を使えるようにして、配列にも対応させます。 将来的にはクラス定義機能も取り入れた、 本格的な型システムを作りこんで行きたいです。
あとは、クラス定義の実現とも絡みますが、関数定義機能も欲しいところです。だた、最初のうちは 組み込みの関数を呼び出す機能のみ持たせます。
ハードウェアへの入出力は組み込み関数に任せることもできますが、 制作する言語ではN88−BASICに捧げる意味で、PRINT文やINPUT文、OPEN文といった、 ハードウェア入出力用のコマンドも幾つか用意することにします。
開発に使用するライブラリの関係上、ハードウェアとの入出力は、いわゆるDOS窓を通じた 文字情報の入出力と、テキストファイルへの読み書きだけにします。しかし、将来的には 図形描画など、Windowsの機能を使える言語に進化させたいと考えています。 その場合、言語処理を行う部分は、Windowsの機能を呼び出す部分と分離して、 システムへの依存が起こらないように作りたいです。
それともう一つの目標として、(当初から無謀とは思っていましたが)僕のように 言語処理系を作ってみたいと思っている人が、読んでみて理解しやすいようなコードを書こうと思います。 (まあ、やはり現状では成功したとはとても言い難いものになってしまいましたが…。)

まあ、当面は「使える」言語というには、おこがましい代物になると思いますので、言語の名称 も「ヘたれBASIC」にしました。
 
スコープ
簡単にいうと、変数名や関数名などの名前のソースコードにおける有効範囲です。 実際には記憶域(データがメモリのどこに記憶されるのか)や、寿命の管理(処理がスコープを抜けた時に、変数として 使われていた領域を自動的に開放する処理)などの処理も考えないといけないので大変ですが、 スコープの概念がない言語でしたら、 最初から最後まで変わらない場所にデータがあれば良いし、 名前の有効範囲のチェックもいらないので、ラクです。
 
制作環境
使った開発環境は、MicrosoftのVisual C++です。 現在自分が十分に使いこなせるコンパイラはこれしかないですし、 Windowsアプリケーション開発用の環境として、広く普及していると思うので これを使うことにしました。
Visual C++にはC言語とC++言語のコンパイラが搭載されているのですが、 開発にはC++を使いました。 言語処理系の実装を解説した書物の多くは、 C言語やPascalなどのサンプルコードを使って説明がなされています。 しかし現在では開発用言語としてはCよりも、C++の方が一般的になってきています。 また言語処理を実現する場合、大抵は何種類ものデータ構造が 絡み合った、とても複雑な状態を管理する必要が生じます。 C++のオブジェクト指向機能を使えば、こうした管理をずいぶん分かり易く記述することができるのです。
また、ライブラリは標準Cライブラリのみを使うようにしました。 FlexやBisonがCの標準ライブラリを必要としているのと、 C++の標準ライブラリと比べ、仕様が小さく手軽だったからです。 標準ライブラリしか使わないので、UNIX系などの開発環境へ移植する際も、 あまり手直しする必要はないと思います。多分。

開発環境を表にまとめると次のようになります。
OSWindows98
開発環境Visual C++ 6.0
使ったテンプレートWin32 Console Application
言語C++
字句解析器生成ソフトFlex 2.5.4
構文解析器生成ソフトBison 1.2.7
ライブラリ標準Cライブラリ
 
前のページへ  次のページへ
言語処理系の制作に戻る
もくじに戻る