し制限の方法が低レベルで間接的であるため有効な制限を与えることや,Monadic Primitive で各内部関数の性質を決定することの困難さといった問題がある.そのため同一の言語の 意味単位に対する拡張がより自由に組み合わせられるような設計のための方法論の存在が 求められる.
semantics を利用している.
Duggan [4] は,Javaのクラスを部品のように組合せてインタープリタを構築する方法を
提案した.このアプローチでは monad-transformer を mixin を利用してJava に導入する ことでインタープリタのモジュール化を実現した.我々のアプローチでは,コンパイラの 定義をアクションの組み合わせではなく,より直接的なコードの生成過程の記述として表 現する.その際 monadic semanticsはコンパイラ記述言語のメタレベルとして隠蔽される.
7.2.2 コンパイル時自己反映計算
CRMLは,関数型言語MLにおいて,コンパイル時の自己反映的な計算を実現した言語 システムである.CRMLの目的はSMLにおいてLispのマクロに相当する機能を実現する ことである.すなわちプログラムの一部をユーザーが対応する構文木を表わす操作可能な データ構造で表現しプログラム中の変更を可能にする.CRMLの設計は,すべてのプログ ラムの記述を,メタレベルでおこなうようになっている.実際の記述は,システムが提供 するベースレベルの表現をメタレベルの表現に変換するための構文と,直接記述したメタ レベルの表現を,組み込むための機能を利用しておこなう.こうした変換と埋め込みはコ ンパイル前にすべておこなわれるので,そのまま直接MLの処理系によって扱うことが可 能であり,解釈実行をおこなう必要がないため実行効率が高い点である.また,MLの型 チェック機構を利用することが可能で,実行時の型の安全性を保証することができる.
問題点としてはプログラマが常にメタレベルへの変換を考慮にいれて,プログラムを記 述しなければならないこと,またメタレベルとベースレベルとの境が明確でないので,記 述が困難であり,メタレベルの再利用が困難であるという問題がある.さらに,拡張可能 な部分が,上述のようにコンパイル時に組み込むことができるような記述に限られるため,
単なる構文の拡張にとどまってしまい,動的な改変を直接実現するようなことはできない.
同様にOpenC++[2]はC++において構文木の操作およびその反映をおこなうことを可
能にしたシステムであるが,差分的な拡張に関しては一般的なOOPの枠組にとどまる.
Javaの拡張可能なプリプロセッサEPP[28]は,ユーザーが拡張可能な, 柔軟なソースコー ド変換器を提供したフレームワークである.拡張機構としてmixinを採用することで差分 的な拡張を実現している.コード変換の正否によって言語拡張の結合の正否を決定するこ とで言語拡張のモジュール化における安全な結合を達成しているが,本研究のように関数 の参照関係によらないような依存関係による問題を判定することはできない.
本研究のアプローチはコンパイル時の自己反映計算をおこなうシステムで,ユーザーが コンパイラの内部構造に対して変更を加えるような機能を提供するものであると考えるこ とが可能である.しかし,コンパイラ自身は非常に複雑なシステムであり,言語の意味の 変更を,コンパイラのコード生成過程に反映させることは困難であり,ユーザーにとって の負担が大きくなる.そこで我々は容易にするような階層化と抽象化をおこなうことで負 担の軽減を図っている.
また,より広範な問題領域に関する適用可能性を考えると,コード生成レベルにまでふみ こんだ拡張可能性は重要な要素である.例えば実行効率の低下が致命的になるような計算 を記述するような言語への要求や,並列計算機やゲームマシンのような特殊なマシンアー キテクチャに適用可能な言語拡張の枠組が今後必要とされると考えられ,複数のターゲッ トマシンへの適応に関しては重要な今後の課題である.
7.2.3 属性文法の利用
また拡張属性文法を用いたメタレベルの抽象化方式を与え, その形式的な定義を与えた 研究として, [24]がある.これは言語システムに限らない, より一般的な記述系に対するメ タレベルを対象としたフレームワークであり, 広範な適用が期待できる.
7.2.4 安全な拡張記述のための方法論
本研究のアプローチでは, 拡張の記述者が再拡張に関する制限を直接指定することで, 衝 突の回避を実現する.すなわち拡張機構を制御する責任がモジュール設計者に属するとい う方針を採用している.そのためシステム側は, 基本的にモジュール設計者の意向に従って 拡張モジュールを利用したプログラミングを支援するという立場に徹する.
そのため,モジュールの定義をおこなう立場のユーザーに対しては, より再拡張の容易な 優れた方法論の提案が必要であると言える.このような結合可能な拡張に関する方法論的 なアプローチとしては, Muletらによるメタオブジェクトの合成に関する話題 [18] で述べ られている.