3.3 モジュールのメタ表現
3.3.2 例:(条件式)
より複雑な例として, 条件式のコンパイルをおこなうcomputationを追加する. 表 3.2 に, 必要なcomputationの一覧を示す.
条件式を扱うためのcomputationの定義を 図 3.11に示す. コード生成の流れを直感的に 説明すると,まず最初に条件部のコンパイルをおこなう. 次に computation“set-address”
が分岐先を格納するための領域を確保し,分岐命令を生成. 最後に“compile-count”を使っ て分岐先の計算をおこなう.
compile :: T erm→M Register compile (If e1 e2e3) = (compile e1)
r1 (set-addressr1jump)
a1 (compile-counte2a1 jump-then) r2 (set-addressr2 brc-neq)
a2 (compile-counte3a2 jump-else)
set-address :: T erm→Instruction→M Address set-address reg1inst = (alloc-store dummy)
addr (store-inst (cmpi-eqr1 0)) r1 (alloc-reg)
r2 (store-inst (ldr2 gptr addr)) r2 (store-inst (inst r2))
r2 (free-regr1) - (free-regr2) - addr
compile-count :: T erm→Address→M Register compile-countexp addr x = (current-counter)
c1 (compile exp) reg (current-counter)
c2 (store addr ((c2−c1) +x)) - reg
図 3.11: 条件式のコンパイラ
第 4 章
コンパイラ記述言語
我々はコンパイラの動作をユーザーが拡張可能な表現で提供する.本章ではそのための メタ言語を示す.この言語で記述された部品は変換規則に基づいてコンパイラの実装レベ ルと同じレベルで動作するプログラムのソースコードに変換される.その記述形式は前章 で示したコンパイラの動作を定義した関数定義と同等のものであり,今回我々が実装した システムではコンパイラの実装言語はSchemeであるため,変換結果としては Scheme で 記述されたコンパイラのプログラム部品が生成され,コンパイル時に呼び出されることに なる.(図.4.1).
4.1 言語部品の定義
前章では各構文についてコンパイラの各状態に対する直接参照操作の列を与えることに よってコード生成動作の定義をおこなう方法を示した.しかしこのようなコード生成の過 程を直接記述することには以下のような問題点がある.
metamodule add compute f (x)
x+y*z ... end
コンパイラ部品定義 (コンパイラ記述言語による定義)
変換器
コンパイラ定義 (Schemeプログラム)
(unit/sig add (define (f x) (+ x (* y z))
...))
Scheme 処理系
AAAAAAAAAA
解釈実行
既存定義
図 4.1: プログラム実行の流れ
• 部品の定義をおこなうための記述が複雑になる.
• 拡張モジュールの設計者が対象となる部品の全体的な構造を把握することが困難で ある
• 拡張をおこなう際に置き換えの対象となる記述部分を明確に指定することができない
• 他のモジュールの拡張による影響がうまく隠蔽されていないために再利用性が低下 する
• モジュールが実現しようとしている機能とは直接は関係しない低レベルな記述の組み 合わせによってある一つの部分的な機能を実現しているため,複数の抽象度をもつ記 述が混在してしまう
これらの問題はモジュール定義のための記述の抽象度が最も低いレベルに設定されてい たために生じるものでありコンパイラの動作記述の抽象化とそのモジュール化をいかに提 供するかの問題に帰着する.
我々の方針として一つのモジュールの中では一貫した抽象度による記述をおこなうこと ができ,さらに一定の安全な拡張機構を提供するような隠蔽手法を提供する必要がある.す なわち前章で示した抽象度に応じたグループの分類と階層化を自然な形で提供できるよう なモジュール化機構の提案が必須である.
そこで我々はコンパイラの動作を記述するためのより抽象度の高いインターフェイスを 提供する.本節ではコンパイラのモジュラーな定義を補助するための高級なコンパイラ記 述言語を定義し,その言語によって記述された定義を前章で示した直接実行可能な定義言 語(Defining-Language)による表現(メタ表現)への変換規則を示す.