大学にいたころから,いくつもコンパイラをつくってきた. しかし,もう 10 年以上,言語処理系からはなれていた. 最近,ついに仕事でコンパイラをつくる機会がやってきた. 以前とは言語仕様も実装もすこしちがうが,コンパイラづくりはやはりたのしい.
大学にいたときは,学部 3 年のころからコンパイラづくりをしていた. 当時,bit という雑誌に SIMPL という言語のコンパイラづくりが連載されていた. 私はその連載にはしたがわず (?!),自前でおなじ言語のコンパイラを開発した. 何ヶ月かかかったが,当時はまだパソコンなどというものはなかった (Apple II くらいはよのなかにあったが,私のちかくにさわれるものはなかった) ので,東大の教育用計算機センターで Melcom Cosmo 700 という大型計算機のうえで動作させた.
そのつぎにつくったのは Pascal のコンパイラである. 教育用計算機センターにはすでに Pascal のコンパイラがあったが,これはバグだらけだった. バグつぶしも私の仕事になったが,大学院にすすんでから,あたらしいコンパイラを開発することになった. Pascal P というコンパイラのキットをもとにして,フルセットにはすこしたりない (もとの Pascal コンパイラとほぼおなじ仕様の) Pascal コンパイラをつくって,教育用計算機センターでつかってもらった. SIMPL にせよ Pascal にせよ,構文解析はトップダウン (LL(1)) だった. これは直観的にわかりやすい.
卒論のときにはマルチ・コンピュータのための言語をつくったが,処理系は未完におわった. しかし,言語を設計してそれを実装するという "趣味" はこのとき以来である.
就職してからしばらくは Fortran コンパイラの開発が仕事だった. Pascal コンパイラづくりにおいては構文と意味の解析が中心であり,最適化はあまりおおきな目的になっていなかった. しかし,Fortran コンパイラにおいては構文や意味の解析はすでにできているので,最適化が中心課題だった. 最初のコンパイラは S-810 というベクトル計算機,いわゆるスパコンのためのコンパイラであり,並列化されたベクトル演算パイプラインをいかにうまくつかうかが勝負だった.
つぎの Fortran コンパイラ開発は,いわゆる IBM 事件のあとしまつのためのつくりなおしだった. 私の担当は汎用 (スカラー) 計算機のためのコンパイラだったが,ここでも S-810 と同様に配列計算の最適化に焦点をあてていた. ベンチマークで性能をかせぐために,いまではコンパイラの教科書にものっている 「ループ展開」 などの最適化もこころみた.
その後は実用的な処理系からはとおざかっていた. 趣味的に,Lisp や Prolog 風,あるいは項かきかえ言語など,いくつかの処理系をつくった. しかし,やがて趣味においても処理系からとおざかっていった.
そうして,やっと仕事でふたたび処理系を開発することになった. 今度は相手はネットワーク・プロセッサである. ネットワーク・プロセッサはプロトコルの処理などを高速かつ低コストで実行するとができるが,高速化のためのおもなしくみはベクトル計算機と同様にパイプライン処理と並列処理である. したがって,かつてまなんだ知識がやくにたつはずである.
今回は言語仕様からあらたにつくろうとしているので,構文と意味の解析も必要である. 従来やってきたのとはちがって,Yacc 的なツールをつかって,したがって構文解析はボトム・アップ (LR(1)) でやる. 言語仕様についてもいろいろくふうが必要になっているが,それはいずれ論文に書くことになるだろう. それについてもすこしだけ書いておくと,いまや Pascal はほとんど世間ではわすれられていて,C, C++, それらに構文的に似せた Java などの言語が全盛だ. つかってもらいたければ,ここはやはり Java に似せた言語仕様にしておくのが得策だろう.