記録を続けます。今週いよいよ Flash 向け自己記述 lisp コンパイラが完成しました。自己記述コンパイラというのは、自分自身の言語で書かれたコンパイラという事で、私のやつは次のように構築しました。
- まず、他の人の作った言語で lisp コンパイラを記述します。このコンパイラは lisp プログラムを受取り、flash のバイトコードである abc 形式のファイルを出力します。この abc ファイルは、Flash の VM である Tamarin や、ひと手間かけて普通の Adobe Flash Player で動きます。
- 出来上がった lisp コンパイラと Tamarin を使って、また lisp コンパイラを記述します。このコンパイラも同じように lisp プログラムを受取り abc ファイルを吐き出します。
- するとあら不思議、lisp コンパイラを使って lisp コンパイラを作ってしまった事になります。ここから先は Tamarin さえあればどんどん言語を進化させて行く事が出来ます。
自己記述言語を作る理由は色々あると思うけど、何よりプログラミング言語ファンなら一度は作ってみたいと思う一つの目標地点であります。まるで富士山に登った時のような達成感があります。とても勉強になるのでみんなもやってみると良いと思います。自己記述言語と一言で言っても、難易度に色々あると思うけど、参考までに私がこれを作ると決めた理由をあげます。
- コンパイラかインタプリタか -> コンパイラに決定
- ガベコレを作るかどうか -> 作らない。
- 正直低レベルの話は苦手なので。
- ネイティブコードか VM か -> VM
- 機械語苦手なので。
- VM を自作するか -> しない。
- 面倒くさいので。しかし、出来合いの VM (Tamarin) が ActionScript 前提に作られていて結構苦労した。
- アセンブラを自作するか -> 自作した。
- 面倒だったが、Tamarin についてくる奴がバギー過ぎて使い物にならなかったので自作しました。
- 言語の選択 -> Scheme もどき。
- ドキュメントが沢山あって楽。
こうして見ると、自作言語を作る人用のキットみたいな物があったらいいのになーと思いました。特に、Tamarin は末尾再帰の最適化や継続が作れなくて面白いテーマに挑戦出来ないので、もっと最近の言語に対応した VM で、外から使えるアセンブラがあって、ガベコレなんかも好きな人はカスタマイズ出来るような奴があれば良いなと思います。