決してメジャーではないがそれなりに使われている、FORTHという言語がある。
関数(FORTHではワードと称する)の引数と戻り値がともにスタックを経由する。またコンパイラは中間コード(threadedコード)を生成し、インタプリタがこれを実行するという構造。そのため文法も普通じゃない(笑)という強烈な個性を持つ。
この系統のSTOICというコンパイラを開発した人が「EPSONが私のこのSTOICを開発に使ってくれたんじゃないかと想像している」と書いていたり、実はアタシはEPSONに在籍していたことがありプリンタのファームウェアの開発現場で端末画面にFIFTHというおなじくFORTH系のコンパイラが使われていたことを知っていたり、まぁアタシにとってはいろいろとご縁のある言語なんだ。
しかしなんといってもアタシをこのクセの強い言語に結び付けたのは、この世界での最初の恩師、三浦高志さんだ。アタシに8bitマイコンプログラミングの手ほどきをしてくれた三浦さんがその教材に選んだのが、I/O誌に掲載されたTinyFORTHのアセンブルリストだったからだ。ご自身で何枚かのフローチャートを書いてくださり、「ね、ここでEnterを押すといままで入力された文字列の先頭アドレスをDEレジスタに持ってディクショナリ、辞書ね、ここをサーチするわけ。で、見つけたらその先頭番地を持ってこっちの実行時インタプリタに飛ぶのさ」とていねいに教えられた。いまその場面を思い出してもドキドキワクワクしてくるが、おかげでアタシはZ-80のアセンブラよりむしろ早く、FORTHというコンパイラを覚えたわけだ。
もちろんそのときそう思ったわけではないが、その後のプログラマ人生の中で何度か自分自身でFORTHコンパイラを開発するたびに「これをそのまま実行するFORTHエンジンがあったらなぁ、ほしいなぁ」と思ったものだ。FORTHという言語の核は「スタックアーキテクチャのFORTHというCPU」であり、それをソフト的にシミュレートすることでシステムが実装されているのだ。だからこれをソフトシミュレータではなく専用のハードで動かすことができたらと思っても、そう不思議はないだろう。普通のソフト屋(?)ならそう思わないかも知れないが、アタシはソフト屋にしてはかなりハードに詳しかったので。まぁ普通のソフト屋はFORTHとか使わんか。^^;
------- *
FPGAやろうかなと思ったのはFORTHとは関係ない話なんだが、上に述べたような願望があったのですぐに「あ、こいつであれ作れるじゃん」とひらめいたのだ。そうなると俄然やる気が湧いてきた。Google先生を蹴飛ばして情報集めをすると、最近のFPGAは能力が高く、CPUをその内部に構築することも可能だと書かれている。つまりFPGAを汎用CPUにすることができるというのだ。
FORTHマシンを作るといっても、ソースコードを食わせるコンパイラは文字列を扱うので、さすがにデジタルロジック回路では実装しにくかろう。それはFPGA内に構築した汎用CPUに任せる。そして空いたスペースを使ってFORTHの核となるデータスタックとリターンスタック、そしてそれらを操作する機能を実装すればいい。とまぁ、バラ色の脳味噌で夢は膨らむ。
最初のうちはハードであるFPGAも、それにロジックを教え込むソフトであるHDLという言語も、なによりそれらをすべて含むカスタムICの世界観というものがなかなか頭に入ってこない。無理やり押し込んでも今度は腹にストンと落ちない。数日ジタバタしたあげく、まぁいいか、とにかくFPGAの中にスタックマシンを実装してみよう。その動きを見ながら先のことを決めていけばいいじゃないかと腹を固めた。
そう決めたので改めて、その方向で勉強を始めた。まずはVerilog HDLという言語の勉強を始めたわけだが、どうもなぁ…スッキリしない。今朝わかったんだが、HDLがなまじ言語の体裁を持っているため、どうしてもソフト屋の頭で考えてしまうようだ。違う違う、そうじゃなくて、アタシはいまICを設計しているのだ。父ちゃん、わかったよ。
どうすれば使いやすいスタックマシンが作れるか、その一点に集中すればいい。FORTHコンパイラが吐き出したthreadedコードを実行する際に肝心要のスタック操作、たとえばDUPというプリミティブなスタック操作ワードをこの専用ICにどう実行してもらえばいいのか、結果をどうもらえばいいのか、そう考えたらいいんだと気が付いた。やれやれトシは取りたくない。若かったころなら一瞬でここまで行き着いたものだろうに。まぁそれでも一瞬と数日の違いだ。たいした差ではない。あはは。
------- *
という次第で、お勉強は続くのだった。