アスペクト指向言語のための 独立性の高いパッケージシステム 理学部 情報科学科 指導教員: 千葉 滋 学籍番号: 03-03150 今吉 竜之介 asf
Javaパッケージシステム プログラムをモジュール化 する機構 外部からはパッケージの インターフェイスを通してのみ アクセス可能 × × 一貫した処理は一つの パッケージに所属 パッケージは再利用の単位 外部からはパッケージの インターフェイスを通してのみ アクセス可能 パッケージ内部の挙動を保障 パッケージ class class class class class インターフェイス class × × class class
アスペクトはパッケージの モジュール性を破壊 class class aspect アスペクトの織り込みに対する制御は存在しない アスペクトはインターフェイスを 無視することが可能 パッケージ内部のアスペクトが外部に影響を及ぼす ポイントカットが一致すれば どこにでもウィーブされる ポイントカット記述にワイルド カードが使用された場合 class class class class aspect class
規律あるアスペクトの織り込み ジョインポイントの選択に 対してパッケージ単位で 範囲を規定する × 明示すれば選択範囲を 拡大可能 × class class aspect ジョインポイントの選択に 対してパッケージ単位で 範囲を規定する パッケージ外のジョインポイントは選択不可 ワイルドカードによる誤った 選択を防ぐ 明示すれば選択範囲を 拡大可能 インターフェイスに対する アドバイス 公開ポイントカット × class class class × class aspect class アスペクトとジョインポイントが 同一パッケージ内にあれば許可 選択可能な 範囲
インターフェイスに対する アドバイス 特定のクラスメンバへの外部からのアクセス全てに作用させるアドバイス class class 特定のクラスメンバへの外部からのアクセス全てに作用させるアドバイス 外部から見ればそのアドバイスはインターフェイスと 見なせる 外部の特定のパッケージを指定することは不可 明示的に記述する必要があるため、予期せぬ 織り込みにはならない class class class × aspect aspect class 特定のクラスメンバへのアクセスを 選択するポイントカットに [&& !within(自パッケージ)]を 追記することでパッケージ外部に作用可能
公開ポイントカット 公開されたポイントカットを用いればパッケージ外部へアクセス可能 抽象アスペクトを継承する ことで親アスペクトのポイントカットを利用可能 継承したポイントカットを利用するときは親アスペクトと 同一パッケージと見なす 親として指定されるアスペクトは抽象アスペクトでなければならない 公開側も継承側も明示的な宣言が必要 class class class class class 抽象 aspect aspect class 抽象アスペクトを継承すれば 親アスペクトのポイントカットを 利用可能
実装 AspectJ言語を拡張して制限を追加 実装にはabc(AspectBench Compiler)を改造 Aspect Info Advice Weaving を拡張 AspectJ言語を拡張して制限を追加 実装にはabc(AspectBench Compiler)を改造 初期コード数:92099行 / 追加コード数:581行 abcでは、全てのジョインポイントは そこに織り込まれるアドバイスのリストを保持 織り込む直前に、そのリストにある全ての アスペクトの情報をチェック 所属パッケージ、親アスペクトの有無など パッケージ制限のルールに適していなければ、 そのアドバイスはリストから除外 全てのジョインポイントに対して同様の処理を実行 インタータイプ宣言にも同様のルールを追加
実験:AJHotDrawの移殖 パッケージ制限によるアスペクトの 情報の変化を計測 対象: AJHotDraw アスペクト指向で設計されたDrawing Tool コード数:41903行 / ファイル数:300個 パッケージ制限下でも正しく動作するようにアスペクトを修正 修正前 修正後 ・アスペクトを含むパッケージ数 ・アスペクトのファイル数 ・アドバイスの数 ・インタータイプ宣言の数 ・ウィーブの合計数 3 10 5 31 44 7 17 ・ 修正後はアスペクトの数が増加 ・ 作用するアスペクトを探す手間は 減少
実験:コンパイル時間の比較 実験環境 abcとパッケージ制限付きabcで CPU: AMD Athlon 64 2.20GHz コンパイルした際の時間を計測 ソースはAJHotDrawを使用 パッケージ制限下では コンパイルエラー 修正前のソースにはパッケージをまたぐアスペクトが存在 実験環境 CPU: AMD Athlon 64 2.20GHz メモリ: 2GB OS: Windows XP SP2 Java SDK: 1.5.0 abc: 1.2.1 abc パッケージ制限付きabc 修正前のソース 修正後のソース 42.8(s) 42.3(s) コンパイルエラー 42.5(s) ・オーバーヘッドは 約0.3% ・十分実用的な 速度
関連研究 本研究はアスペクトの選択可能なジョインポイントの 範囲を制限するアプローチ プログラムをアスペクトの進入から守るアプローチ Open Modules [Aldrich et al. ’06]、ccJava [境ら ’06] 織り込みの影響を制御するアプローチ COW [篠塚ら ’05]、Impact Analysis of Weaving [Hideaki et al. ’05] 織り込みの見せ方を改善するアプローチ XPI [William et al. ’06]、AAIF [Kiczales et al. ’05]
まとめと今後の課題 まとめ 今後の課題 規律あるアスペクトの織り込み方法を提案 明示的に選択可能な範囲を拡大する方法を提案 abc(AspectBench Compiler)を改造して実装 アスペクト指向で設計されたAJHotDrawを移殖 今後の課題 ルールの洗練 パッケージをまたぐようなクラスの継承がある場合の ジョインポイントの選択方法など ケーススタディの充実 ファイル数だけでなく、アドバイスやインタータイプ宣言が 増加する例の発見