end end
これらの制約によって結果的に順序にかかわらずログが生成される.
第 7 章 まとめ
本研究では以下のアプローチをとり安全にモジュラーな言語拡張が可能なシステムの構 築をおこなった.
• コンパイラの特に実行コード生成の部分について,Monad を利用したコンパイラの モジュール化のための枠組みを示した.
• コンパイラ記述言語による高級な言語部品の記述方法を示した.
• 低レベルな記述をメタレベルとして分離することで,部品の共有化を可能にした.
• 各定義の上書きによる拡張のための仕組みを示した.
• 拡張時の内部状態へのアクセス制限によって再拡張の制限をおこなうことによる衝突 回避の方法を提案した.
7.1 考察
本研究が想定するシステムではまず拡張モジュール間の優先度を言語部品のエンドユー ザーが設定するための優先度決定のための前提として適用順位がよりおそい拡張モジュー ルを優先することにした.すなわちあとから適用された拡張の性質が強くなるという前提 である.次にシステム側である程度拡張に関する制限を加ることで安全性を強化した.
• 実装する機能の抽象度に応じた階層構造を設計する.このことによってモジュールの グループ化をおこなうことで部分的にモジュール間の参照関係を固定化することがで
きる.
• 拡張にともなう参照関係の変化を限定的なものにするために拡張が可能な階層を選別 する.
• コンパイル過程の共有化によって拡張の影響を正しく伝播させる.モジュールの変更 はそれを利用するモジュールにおいても自然に反映される.
これらは拡張性と安全性とのトレードオフに基づくシステム側の選択であり拡張可能な 部品を高位の階層に限定することで混乱を防ぐ効果がある.
さらに拡張モジュールの設計者側で設定する必要のある拡張に関する情報を以下のよう に設定した.
• モジュール単位で再拡張をおこなう際,より優先度の高い拡張モジュールに対してコ ンパイラの状態へのアクセスに関する明示的な制約を与える.
• 拡張モジュールを適用することでモジュール間の依存関係にどのような変化が起きる のかの明示的な記述をおこなう.
これらは拡張モジュールの設計者が与えるシステムに対する衝突の可能性に関するヒン トである.さらに言うならばこれらの情報自身が衝突の概念の定義そのものであるとも言 える.すなわち何が拡張間の衝突であるかは拡張モジュールの設計者の責任であるという 立場をとるものである.
まとめると,システムで提供された拡張の枠組で定義された拡張モジュールのなかで以 下の条件にあてはまるものを言語拡張の衝突とよび,言語を再構築する時点でこれらの衝 突をおこさないような選択肢を選ぶか,あるいは選択肢が提供されていな場合は警告をお こなうことで言語拡張の衝突回避を実現した.
• 拡張モジュールの適用順位によってユーザーが想定している拡張間の優先度と,拡張 モジュールの設計者が与えた制限に基づく優先度が一致しない場合.
• 依存関係の変化に対応するような拡張部品が提供されていない場合.
本アプローチはコンパイラを構成する部品を実現している各内部関数がどの Monadic
Primitiveを呼んいるかによってその性質が表現されるような拡張に有効な枠組である.ただ
し制限の方法が低レベルで間接的であるため有効な制限を与えることや,Monadic Primitive で各内部関数の性質を決定することの困難さといった問題がある.そのため同一の言語の 意味単位に対する拡張がより自由に組み合わせられるような設計のための方法論の存在が 求められる.