プログラマyasuhoの隠れ家

某ソフトウェア企業に勤務するおじさんプログラマyasuhoです

FOCS (中編)


というわけで、FORTRANコンパイラを作るべく、情報収集を始める。

構文解析


コンパイラ自然言語の構文を解析し、対応する機械語コードに変換する、というイメージは何となく知っていた。
よし、まずはコンパイラの理論を書いた本でも見て研究しよう。
そう思って、本屋さんでコンパイラについて書かれた本を手当たり次第に立ち読みすることから始める。


いろいろと読み進めること数日。。。


○| ̄|_


だめだ。何が書いてあるのか、さっぱり分からない。
せめて構文解析だけでも理解しようと思ったのだが、トークン?二本木構造?なんだそりゃ。
(今でもそうかもしれないが)当時のコンパイラに関する本は理論が中心で、とても駆け出しプログラマが理解できる代物ではなかったのだ。
このままじゃ、これを理解する前に高校3年生が終わってしまうぞ(汗)


そんなある日、本屋で見かけた「MZ活用研究」という本。
そこにはなんとMZ用Tiny FORTRAN - FORMの全アセンブラリストが掲載されていた。
これを見れば、もしかすると構文解析の方法が分かるかもしれない。
そんな淡い期待を抱き、ぼくはその本を持って書店のレジへ向かっていた。


家に帰ってFORMのアセンブラリスト、特に構文解析部分を眺める。
なるほど。構文解析はこうやってやればいいんだ。
この時ぼくは初めてまともに(任意数値の階乗を求めるとか、あまり実用性のないことじゃなくて)再帰呼び出しを使うやり方を学んだのだった。

ハンドアセンブル


PC-8001FORTRANの文法が決まったら、いよいよ機械語によるプログラミングを開始。
この時代機械語を書いていた人は分かると思うが、当時はアセンブラというものは、あまり使われなかった。
いや、正確にはアセンブラがなかったわけではないのだが、アセンブラをメモリ上に乗せると、肝心のプログラム領域がアセンブラとぶつかってしまい、使えないことが多かったのだ。
さらに当時はハードディスクどころか、外付けフロッピードライブが本体より高かった時代。
唯一の外部記憶装置であるテープからアセンブラをロードしていたのでは、時間がかかって仕方がない。


そんなわけで、当時のアセンブラは自分の頭脳、すなわち「ハンドアセンブル」が主流だった。
最初にアセンブラのソースを書き、命令コード表を見ながら、それを自分で機械語コードに変換し、モニタ*1からメモリ上に書き込んで実行する。
プログラムを部分的に作ってはテスト、作ってはテスト、を繰り返し、少しずつプログラムを完成させていく。
今考えると、なんとものんびりした開発をしていたものだ。


30代のプログラマが近くにいたら、16進数の"21"や"CD"*2が何を意味しているか、尋ねてみよう。
アセンブラの命令が分かる人は、間違いなくぼくと同じ世代の人である。
「ハンドアセンブル」してると、機械語コードからアセンブラが連想できるようになる(正確には「なってしまう」)のです。
今となっては何の役にも立たないけどね。。。

ROM内ルーチン解析


当時のマイコンは今のパソコンのようにBIOSもなければ、ハードウェアを扱う便利なライブラリも用意されていなかった。
BASICでやれば簡単なことが、機械語ではいきなり敷居が高くなる。
たとえば画面に文字を表示させるだけでも、スクロールなんかを考えるとけっこう大変で、それでなくても少ないメモリを圧迫してしまう。


BASICなら簡単にできるんだから、BASIC ROMの中にそれを実行する部分があるはずだ。
そう考えて、ROM内部を逆アセンブルし、使えそうなルーチンを探した人は多かったと思う。
今やると違法になるのかな。
当時もPC-8001のROMを全部逆アセンブルして解説付きで出版していた出版社がNECに訴えられていたっけ。


とはいえ、雑誌にもROM内ルーチンの解析記事がけっこう堂々と載ってたりした。
さらに細かく調べるため、ぼくはBASIC ROMを全て逆アセンブルし、学校のプリンタで印刷。
「おまえ、何やってんだ?」と尋ねる先生に、ぼくは「いえいえ、卒業研究のネタですよ」と言っていたが、何をしてるかはバレバレだった。^^;;
あの時笑って許してくれたN先生、ありがとう。。

そして。。


ちまちまとハンドアセンブルを繰り返し、ROM内ルーチンを駆使してプログラムを作り続けること一月余り。。
ようやくコンパイラも完成が近づいてきた。
思ったより時間がかかったけど、なんとかなりそうかな。
そう思っていた矢先。
トラブルって、思いもかけないところから沸いてくるんだよね。。。


(TO BE CONTINUE)

*1:表示装置ではなく、当時のパソコンには、メモリを直接編集したり実行したりする、簡易デバッグ用プログラムが用意されていた。MS-DOSのdebug.exeのようなものだ

*2:8080,Z80限定