AOP言語への 織り込みインターフェイスの導入 A Weaving-Interface for AOP Languages 境 顕宏 (九州工業大学大学院 情報工学研究科) 鵜林 尚靖 (九州工業大学 情報工学部) 玉井 哲雄 (東京大学大学院 総合文化研究科) November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> 発表内容 研究の背景と目的 織り込みインターフェイス ccJavaとその記述例 実装 関連研究 まとめ November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> 1. 研究の背景と目的 November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> インターフェイスとは OOPにおけるインターフェイス クラス設計者 クラス利用者 メソッドシグネチャ クラス設計者はクラスがどう使用されるかを意識する必要がない. クラス利用者はクラスの実装を意識する必要がない. インターフェイス:二つのものの間に立って、情報のやり取りを仲介するもの。また、その規格。 November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> 現状のAOP言語 アスペクト指向プログラミングにはObliviousness(忘れっぽさ)がある. クラス設計者はアスペクトによる織り込みを意識しなくてよい. アスペクト設計者はクラスの詳細な実装を意識しなくてよい. 現実にはクラスを変更したとき,予期しない織り込み結果が発生することがある. November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> 例題:簡易図形エディタ class Point implements Shape{ int x,y; void setX(int x){this.x=x;} void setY(int y){this.y=y;} void moveBy(int dx,int dy){ x+=dx; y+=dy; } class Line implements Shape{ void setP1(Point p1){this.p1=p1;} void setP2(Point p2){this.p2=p2;} p1.x+=dx; p1.y+=dy; p2.x+=dx; p2.y+=dy; aspect Display{ after(): execution(void Shape.set*(..) || execution(void Shape.moveBy(..)){ /* 再描画処理 */ } ※ 図形の座標が変更されたら,画面を再描画. November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> クラス拡張時に起きる問題例 class Point implements Shape{ int x,y,id; void setX(int x){this.x=x;} void setY(int y){this.y=y;} void moveBy(int dx,int dy){ x+=dx; y+=dy; } void setID(int id){this.id=id;} /* Lineクラスは省略 */ class Point implements Shape{ int x,y; void setX(int x){this.x=x;} void setY(int y){this.y=y;} void moveBy(int dx,int dy){ x+=dx; y+=dy; } aspect Display{ after(): execution(void Shape.set*(..) || execution(void Shape.moveBy(..)){ /* 再描画処理 */ } クラス開発者がアスペクトの織り込みを意識せずにクラスを拡張した結果,プログラムの振る舞いが意図しない結果になった. November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> AOPにおけるインターフェイスのあり方 クラス設計者 アスペクト設計者 ジョインポイント クラス設計者はアスペクトによる織り込みを意識する必要がない. アスペクト設計者はクラスの詳細を意識する必要がない. November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Crosscut programming interface(XPI) [Sullivan, et al. FSE2005] ポイントカットpoint()はPointの状態変化を捉えることが目的. Pointの状態遷移はpointポイントカットに従って呼び出される. アドバイスはPointの状態を直接または間接的に変えてはならない. public pointcut point(Point p): target(p) && execution(void Point.moveBy()) || execution(void Point.setX()) || execution(void Point.setY()); public pointcut topLevelPoint(Point p): point(p) && !cflowbelow(point(Point)); 自然言語によりクラスとアスペクトが満たすべき条件をデザインルールとして記述. November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> AOPの問題は解決したのか? 従来のAOP言語は横断的関心事をアスペクトとして記述. 横断的関心事と基本的関心事は相対的なもの. これらを区別せずに,全てクラスとして扱うほうが望ましい. Class Aspect Class Class Aspect Class November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> 織り込みインターフェイスの考え方 クラス設計者 関心事の合成 クラス設計者は関心事の織り込みを意識する必要がない. 関心事の合成時にクラスの詳細を意識する必要がない. November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> 本研究のアプローチ 関心事その合成の間でインターフェイスを考える. → 織り込みインターフェイス Class Class 公開するジョインポイントを実装しなければならない. 公開された箇所同士を繋げる = 織り込み Class Class どこがどこに織り込まれるかが明確. November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
? ? 本研究のアプローチ 他の織り込み インターフェイス 独立して開発可能 Class 公開するジョインポイントをカプセル化 どう織り合わせられるかは知らなくてよい. 他の織り込み インターフェイス ? クラスがどう実装されているかは知らなくてよい. 独立して開発可能 November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> 織り込みインターフェイスによるメリット コンポーネントベース開発が可能. コンポーネント間の結合=織り込み 変更容易性の向上 Class Class 拡張性 Class Class 再利用性の向上 Class Class2 Class 置き換え Class Class 繋ぎ変え November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> 2. 織り込みインターフェイス November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> 織り込みインターフェイス pointcut set : execution(void setX()); xFigure set 織り込み xDisplay update pointcut update : execution(void update()); Point void setX(int x){ //値の更新 ・・・ } Display void update(){ //画面再描画処理 ・・・ } Display.update()をPoint.set()とLine.set()の位置に織り込み. xFigure set 織り込み pointcut set : execution(void setP1()); Line void setP1(Point p1){ //値の更新 ・・・ } November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> 3. ccJavaとその記述例 November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> ccJava ccJava: Class-based Crosscutting language for Java JavaをベースにしたAOP言語. 全ての関心事をクラスとして記述する(クラスベースAOP). クラスに外付けした織り込みインターフェイスを介して織り込みが行われる. November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
ccJavaによる簡易図形エディタの記述 xDisplay 織り込みインターフェイスの実装定義 class クラス implements 織り込みインターフェイス名(,・・・) ポート間の結合定義 connect(エクスポート側のポート, インポート側のポート) w_interface xFigure{ pointcut set() : execution(void set(..)); import around(): set(){ this.proceed(); import.proceed(); } w_interface xDisplay{ pointcut update() : execution(void update()); export update(); weave{ class Point implements xFigure; class Line implements xFigure; class Display implements xDisplay; connect(xDisplay.update, xFigure,set); ポイントカット: 公開するプログラムポイントを記述 pointcut 名前() : 本体 本体: execution, call 等 (AspectJの表記に近い) class, method, field (クラスの静的な構造) インポート指示(アドバイス): ジョインポイントの動作を記述 Import before(after,around等) ポイントカット名{本体} 本体: import.proceed() (取り込まれたプログラムポイントの実行) this.proceed() (本来のプログラムポイントの実行) エクスポート指示: ポイントカットで示したプログラムポイントを外部に公開 export ポイントカット名; pointcut update Display void update() xFigure pointcut set Point void setX() void setY() xFigure pointcut set Line void setP1() void setP2() November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
クラスの拡張時の問題の解決 xDisplay Display xFigure Point 織り込みインターフェイスを守っている限り, w_interface xFigure{ pointcut set() : execution(void set(..)); import around(): set(){ this.proceed(); import.proceed(); } w_interface xDisplay{ pointcut update() : execution(void update()); export update(); weave{ class Point implements xFigure; class Line implements xFigure; class Display implements xDisplay; connect(xDisplay.update, xFigure,set); pointcut update xFigureの中で定義されていないsetID()は織り込みの影響を受けない Display void update() xFigure pointcut set Point void setX() void setY() void setID() 織り込みインターフェイスを守っている限り, 織り込みにより予期しない振る舞いの変更が行わない. xFigure pointcut set Line void setP1() void setP2() November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> コンポーネントベース開発として有効な例 コンポーネントの拡張 (クラスの拡張時の問題の解決として説明) コンポーネントの置き換え コンポーネントの繋ぎ変え November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
2.コンポーネントの置き換え xDisplay xDisplay DisplayB DisplayA xFigure Point pointcut update xDisplay pointcut update w_interface xFigure{ pointcut set() : execution(void set(..)); import around(): set(){ this.proceed(); import.proceed(); } w_interface xDisplay{ pointcut update() : execution(void update()); export update(); weave{ class Point ximplements xFigure; class Line ximplements xFigure; connect(xDisplay.update, xFigure.set); DisplayB DisplayA void update() void update() xFigure pointcut set Point 織り込みインターフェイスを差し替えるだけで 織り込むクラスを差し替えられる. void setX() void setY() xFigure class DisplayA ximplements xDisplay; class DisplayB ximplements xDisplay; pointcut set Line void setP1() void setP2() November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
3. コンポーネントの繋ぎ変え xDisplay xScheduler Display Scheduler xFigure Point w_interface xFigure{ ・・・ } w_interface xDisplay{ w_interface xScheduler{ pointcut signal(): execution(void signal()); export signal(); import after(): execute(); weave{ class Point implements xFigure; class Line implements xFigure; class Display implements xDisplay; connect(xDisplay.update, xFigure,set); pointcut update pointcut update Display Scheduler void update() void signal() void execute() xFigure execute(): 取り込んだジョインポイ ントの実行 = 再描画 signal(): 織り込み先メソッドの実行 時にフラグをセット = 座標変更の監視 内部で一定時間置きに, If (signal) { singal=false; execute(); } pointcut set singal execute Point コンポーネント間を繋ぎ変えで(既存のクラスの 変更なしに),機能の追加が可能 void setX() void setY() xFigure pointcut set connect(xScheduler.signal, xFigure,set); connect(xDisplay.update, xScheduler,execute); Line void setP1() void setP2() November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> 5. 実装 November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> ccJava処理系の流れ 生成されるコード例 /* FileName : xShape.aj */ aspect xPoint { pointcut onChange() : (execution(void *.set(Point,Point)) || execution(void *.set(int,int))) && (within(Point) || within(Line)); Display m_display = DisplayFactory.getInstance(); void around() : onChange() { proceed(); m_display.update(); } ← 再描画の実行 ← 属性変更 ↓属性変更される箇所を切り出す AspectJポイントカット ↓アドバイス ccJavaソース (織り込みインターフェイス) Javaソース(クラス) ccJavaコンパイラ ccJava パーサ ジョインポイント抽出 AspectJコードジェネレータ AspectJソース AspectJコンパイラ 実行可能Javaプログラム November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
ccJavaにおける AspectJの位置づけ November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> 6. 関連研究 November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> AOPにおけるインターフェイスの研究 Aspect-aware interface [Kiczales, et al. ICSE2005] OOPのインターフェイス内に織り込みの情報を含めるメカニズム. XPI [Sullivan, et al. FSE2005] クラスとアスペクトを設計するためのルールを与える手法. Open Module [Aldrich, et al. ECOOP2005] 織り込みを公開された箇所へ限定するメカニズム. November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> クラスベースAOPに関する研究 Hyper/J [IBM] メソッドのマッチングを行うことで,独立したプログラム同士を合成する. EOS-U [Rajan, et al. ICSE2005] クラスとアスペクトを統合したClasspectの概念を導入. GluonJ [Chiba, et al. ECOOP2005] アノテーションを用いることで,Java文法の範囲内でAOPを実現 November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> 7. まとめ November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>
Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp> まとめ AOP言語におけるインターフェイスの概念を整理し,織り込みインターフェイスを提案. 織り込みインターフェイスを導入したccJavaによる実装例の紹介. November 8, 2018 Akihiro SAKAI <sakai@minnie.ai.kyutech.ac.jp>