Scheme Compiler の勉強(20) - 問題の整理、 Procedures (letrec)

うーん、仕事が忙しいのもあるのだけど、 scheme compiler の勉強が止まり気味。理由はいくつか。

  • procedure を実装したい。ただし、 LLVM IR の define で定義される関数は、高級言語での関数に近く、引数を明示的に指定し、かつ型が付く。"An Incremental Approach to Compiler Construction"が想定しているようなスタックを介しての引数のやりとりとはだいぶ違っている(という気がする)。どうやって対応させたらいいのだろう。
  • PDF 文書の情報が明らかにいろいろ足りていない。
  • scheme を実装するにあたっての常識が自分に足りない。
  • LLVM の情報が少ない、気がする。(あるいは自分の「学ぶ能力」の問題か。)前回記述した http://www.ida.liu.se/~tobnu/scheme2llvm/scheme は、多分古い LLVM 用で、手元の LLVM 2.3 ではエラーとなる。たとえば現在の LLVM IR には uint が無い。

ちょっと背伸びをしすぎたか。しかし let まで実装できているのに lambda が実装できないのはいかにも悔しい。もう少し粘ろう。真面目に普通の scheme を実装するテキストを読んだり、 LLVM 用言語の実装を探して読もう。現時点での能力不足は仕方が無い。

追記:
"Compilers: Backend to Frontend and Back to Front Again", 1.7 Procedures について、
exercies には tests-1.7-req.scm と書いてありますが、作者のサイトから入手できるテストデータでは tests-1.8-req.scm に対応します。適当に "procedure" の部分を切り出してテストデータにしましょう。わたしは tests-1.7-letrec-req.scm というファイルを作りました。
また、 1.7 は固まりが大きく辛いのでまずは (letrec ([f (lambda () 5)] (f))) のような仮引数を持たないラムダ式が通るのを目標にしましょう(と書いていますが、このアプローチが無駄にならないかどうかはまだわかりません)。

  • とりあえず全ての関数が LLVM の i32 を返すことにして、かつ、仮引数は空として、上記まではテストが通るようになった。関数呼び出しはそのまま LLVM の call で、関数名は let と同じくユニークなラベルに対応させる。scheme の pair とかに対応するときに困るだろうけど後で。
  • いまごろ気付いたが、勉強とはいえあまりにもいきあたりばったりだなぁ。やつあたりするなら、この資料テキストとして未完成なんだよなぁ。やっぱり "Three Implementation Models for Scheme " 読まなくちゃ駄目だろうか。