お手軽プログラミング言語処理本とLogo

プログラミング言語を作りたいっ!そう思うプログラマはとても多いと思います。多分 OS、ゲームに並ぶ 3大作りたいプログラム の一つでしょう(←ホントかしら?)

いろいろ参考になる本は多いのですが、ちょっと難し面倒な感じの本ばかりで、本気で作るのならともかく「ちょっとつくろっかな〜」くらいだと重すぎるのです。

もちろんそんなニーズを見逃すハズもなく、そんな層をターゲットにした本ももちろんあります。スモールコンパイラの制作で学ぶ プログラムのしくみ とか いまどきのプログラム言語の作り方 とか。*1 「スモールコンパイラ〜」 は、どうもリンゴ農園のたとえ話にどうしても馴染めなかったのですが、「いまどきの〜」は、なるべく専門用語を使わずに とにかく手を動かしてどんどん実装していくと言うスタンスの本で、なるほどそのコンセプトは一理あって、とても愉しく読めたのですが、ちょっとだけ気になることもありました。

手書きパーザーのジレンマ

人が手で書くパーザといったら、再帰下降解析器でキマリです*2再帰下降解析するには 構文の制約の強いLL文法 になってしまうのがネックですが、文法の自由度の高い LR文法だと、ヒトの手でパーザを書くのはあまり現実ではなく、普通 yacc のようなパーザジェネレータを使いますが、「プログラミング言語処理系を手作りしてる感」に乏しく、この手の本のテーマにそぐいません。

LL文法の制約はかなり強いので「極々フツウの文法」を考えてそのまま乗せようとしても たいていハマってしまいます。*3。そこで、LL解析できるように構文規則の方を変形させる――というのが手書きパーザ作成の定石です。


このチョイスは「ちょっと難し面倒」なタイプの入門書だと、LLだLRだという説明が入るので、ごく自然な流れになるのですが、「いまどきの〜」はポリシー上どうしてもそこの説明が中抜けするので、脈絡なく(パーザの実装を模索するでなく)構文規則を変形しだすのに ザワザワとした違和感を感じます。

ならば、最初から 素直にLLな文法の言語をお題として掲げると、それはそれでワザとらしさバクハツですし「ステップアップして自分独自の言語を作ろう!」につながりにくい所があります。

う〜ん、痛し痒し。「お手軽プログラミング言語処理系本」のちょっとしたジレンマだなぁ、と思いました。

お題:Logo は良問かもっ!

舞台裏が見えていれば一本道なのだけれど、それを水面下に隠したとき、「予定調和へゴリゴリっと」感を如何に隠せるかなんですが、難しいですね。なにか良い方法ないかな〜、なぁんて事を考えていたところに、Logo です。

正規Logo の文法は カッコを取ったLispなので、生粋の LL 文法です。本質はLispなので構文は至ってシンプル。構文解析中に関数検索して引数の数を調べる必要がある以外は、再帰降下法で素直に構文解析できるはず。あとは Interpreterパターンでババンと実行できるようにすれば、とりあえず動く処理系ができます。
2ステップ目として、そのプリプロセッサとして カジュアルなLogo から正規 Logo のコンバータを実装すれば、算術演算子中置記法もサポートしたモダンな言語に早変わり!タートルグラフィクを実装すれば、満足感もひとしおです、きっと。


なんといってもメジャーな言語を自分の手で作り出すという快感がたまらない(ハズ)、Logo を題材に プログラミング言語処理系をつくるって講義、けっこういけてない!?――なぁんておもっちゃったあたしなのです。

*1:他にコンパイラ入門 C#で学ぶ理論と実践 と言うのもありますが、未読です

*2:10分で書ける、お手軽パーザー

*3:再帰(中置くの2項演算子とか) と 展開が2通りになる("if文 ::= if〜 または if〜else〜" 見たいな)ものがダメ