コンパイラを学ぶ理由

この1週間ほど、3imp(Three implementation models for scheme)を読み進めている。3impは、Schemeコンパイラをヒープベース、スタックベース、ストリングベース(コントラバスのことではない)という3つの実装方法で説明した資料。
今は4章のスタックベースの始めの部分を読んでる。非常におもしろい。こういうのは本当は実際に作りながら読むとより理解が深まるんだろうけど、今は自分のPCを修理に出しているのでちょとムリ。PCが戻ってきたらJavaあたりでやってみようかな。*1
それで、バイト先でも休み時間とかに読んでいたら、同じくバイトをしている年上の人に「コンパイラなんてどうせ自分で作っても使わないんだし、意味なくない?」と言われてしまった。確かに使えるコンパイラなんて、そう簡単に作れるものでもないけども。Lisp/Scheme界には言語処理系を勉強している人がたくさんいるように思うけど、皆がみんな「オレオレLispを作ってやるぜ!」と思ってるワケでもないはず。入門書に「インタプリタを作りましょう」というような話題がよく載っていることや、readという組み込みの字句解析器があること、あるいはマクロというより処理系に近い処理を日常的に書いていることが、そういう世界に踏み込みやすい環境を作ってるのかもしれない。
個人的には、「first classの継続ってどう実現されてるの?」とか「(lambda () ...) と書いてもクロージャが生成されないときがあるっていうけど、どうやってるの?」とか、そういう素朴な(?)疑問に対しての答えがほしいっていうのもあるし、そういう内部を知っていた方がより安心して使える気がする。もちろん、すべてのブラックボックスをこじ開けなきゃ気が済まないなんていう姿勢ではないけれど、C言語がいまだに広く使われているのは、そういう「裏で動いてる何か」が少ないことにも因るんだと思う。

*1:Javaは別に好きではないけど、本文のコードがSchemeで書いてあるので、なるべくSchemeから距離を置く言語(だけど書くこと自体はそんなに大変にならない)という意味で、静的型付けでオブジェクト指向なのがいいかなと。あと、GCもあった方がいい。というふうに選択肢を絞っていったら、候補がJavaしか残らなかった。