[scheme] Scheme Compiler の勉強(13)

区切りがいいので少しまとめてみる。

"An Incremental Approach to Compiler Construction" & "Compilers: Backend to Frontend and Back to Front Again" は, Abdulaziz Ghuloum によって書かれた合わせても50ページほど、 Scheme のネイティブコンパイラScheme 自身でインクリメンタルに少しずつ作っていく、という教材的な文書。コンパイラを作ることが魔術的なものではないことを示すために書かれたもので、量からも明らかなように、コンパイラの奥深い技術を学ぶためのものではない。Scheme と CPU と C のごく基礎的知識があれば、進めることができる。gccアセンブラを出力させながら、最初は数字1つを出力するだけの"コンパイラ"からはじまり、少しずつ機能を追加していくというアプローチのため、最初の段階から動くコンパイラが得られることが魅力。

現在わたしはこの文書で勉強中。

コンパイラ本体の compiler.scm, テスト用の tests-driver.scm とテストデータ、C で書く runtime.c からなる簡単な系。compiler.scm と runtime.c を少しずつ作っていく。要 scheme 処理系、要 gcc

良い点:

  • いまのところ(1.3 の途中、全部で1.9まで)なんとか内容についていけている。今朝 fixnum? を実装。
  • 元文書のターゲットは i386 用。そのままでは面白くないので、 LLVM 用として一緒に LLVM を勉強。ユニットテストが動作していることから、おそらくちゃんと動作しているはず。
  • テストを追加しながら進める開発は楽しい。
  • 調べながら進めるのも楽しい。
  • scheme コンパイラを一度でも作っておくと、本物の scheme/lisp 処理系(国産だけでも gauche, mosh, ypsilon, Maeve)で開発者がやっている面白さ/苦労を、より面白く見ることができる。(Lisp を追いかけていると自身がスーパーハッカーでなくとも必ずなんらかの面白いものが見られる、というのはたぶん事実。)

悪い点:

  • 元文書は ChezScheme が対象。scheme 処理系は処理系毎の違いが大きいので、もし gauche で動かす場合は SchemeCrossReference などを参考に tests-driver.scm にも手を入れる必要がある。
  • 元文書で省略されているところは調べる必要あり。
  • 実際にこれを使って勉強したヒトは少ない?
  • インクリメンタルと引き換えに、ときどき先が見えずに不安になる。
  • いまごろ気付いたが、 tests-driver.scm は同じ手続きが2回書いてあったりするなぁ。