今日読んだ本 - 『コンパイラ入門』

2010/02/12

古本屋で安かったから買ってみました。Amazon の評価はすこぶる悪いけれども,言ってるほど悪くはない。コンパイラが何をやっているのか,(実装も含めて)数日でざっくり知りたい向きなんかは参考になると思います。

言うまでもないことですけれど,コンパイラをちゃんと知るのであれば,ドラゴン本を読んで,実際に簡単なコンパイラを実装すること。近頃は,安易なコンパイラ本がたくさん出版されているけれど,どれもドラゴン本の劣化コピー(初心者や趣味の人向け)か,読み捨ての企画モノです。安易に劣化コピーに頼ると,思わぬ遠回りになる可能性がある。本書のような本は,そゆことを踏まえて読むのが,お作法つかなんつかなんですけどね。

と,そこまで言っといて書くのもアレなんだけれど,『入門』の特徴は,C# で実装していながら,割と低水準なお作法で実装しているということ。これはいいと思う。

普通,コンパイラは C のような低水準の言語で作るわけで,Java とか C# とかいった言語で作ることはあまりありません。例えば,スキャナの記述について,ドラゴン本では低水準ならではの検討事項として,入力バッファの扱いをかなり詳細に亘って検討していたりする。

しかし,高水準な言語だと,ここら辺は周辺のクラスライブラリで吸収できちゃったりします。面倒でボトルネックになるような工夫のしどころはさておいて,美味しいとこだけ説明しているわけで,これが「現実の」コンパイラ開発なり,パーサ開発にどれだけ役に立つのか疑問です。

その点,本書では,クラスライブラリを使わずに,わざと自前の関数でスキャナを実装していたりします。実際は C でスキャナを作る場合も,Lex や Flex といったスキャナジェネレータを使うのが一般的なんだけれども,こゆもんは,一回自分で作っておくべきだと思う。比較的人気のあるコンパイラ初心者本である『ふつうのコンパイラをつくろう』では,JavaCC をガッツリ使ってたりするもんで,これって JavaCC の使い方の本なんでね?と思うくらい。それと比べたら,本書のアプローチは正しいと思います。

コンパイラ本のうち,コードジェネレータ(機械語を出力する処理)以前の処理,つまり,スキャナやパーサのような技術については,機械語を扱う向き以外にも有用だったりします。例えば,自前で XML や JSP のようなマークアップ言語を解析したいと思っている向きはいるはず。

(構文|字句)解析器の作り方は,今や理論を通り過ぎて,定番のプログラミング作法になっているので,本書のような薄い本でも,一読するとプログラミングの幅が広がるんじゃないかと思います。応用できる箇所は意外と多かったりするんですよね。

Site Navigation
SNS Accounts (@aian)

普段はここら辺に住んでいます.