#コンパイラレポート課題
工学部情報学科2回 1029-24-9540 山崎啓太郎
##問1 Schemeプログラムの最適化について ###コンビネータの使用 複数のPEGタームを受け取り順序つき選択のPEGタームを返すalt関数、複数のPEGタームを受け取り逐次に解析するPEGタームを返すseq関数、を定義しそれらを使用することで規則の追加に対応できるようにしている。
###関数を返す関数 以下のような関数を返す関数を簡潔に記述できる記法が各所で用いられている。 (仕様上存在しない実装依存な記法ではないか少し疑問です)
(define ((check-char c) string pos)
(if (and (< pos (string-length string))
(char=? (string-ref string pos) c))
(make-result (+ pos 1) c)
#f))
###マクロの使用 使用されることの多い、PEGタームの参照には、以下のマクロが使用されている。
(define-macro (nt name)
`(lambda (string pos) (,name string pos)))
これにより、記述が大幅に楽になる。
###拡張cond式 条件文の評価値が関数に渡せるような式を用いている。 条件文を2度記述しなくてもよいため効率がよい。
(define ((seq-aux term1 term2) string pos)
(cond ((term1 string pos)
=> (lambda (p1)
(term2 string (position p1))))
(else #f)))
###メモ化 関数をメモ化する、memoize関数が定義されており、E,T,Pといった関数はそれによってメモ化されている。 関数がメモ化されると一度ある引数で呼ばれた関数はハッシュテーブルに保存されるため、再度同じ引数で呼ばれた場合に関数内の処理を実行することなく値をハッシュテーブルから検索できるため実行効率がよくなる。
#授業の感想 コンパイラを作る際に様々な知識が必要であるとわかった。 今度、自分の好きな言語のコンパイラを作ってみたい。