AOP言語への 織り込みインターフェイスの導入 A Weaving-Interface for AOP Languages

Slides:



Advertisements
Similar presentations
ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
Advertisements

関心事指向アーキテクチャモデリング環 境 Concern-oriented Architecture Modeling Environment 九州工業大学大学院情報工学府 情報科学専攻 鵜林研究室 M1 佐藤 友紀 1.
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
シーケンス図の生成のための実行履歴圧縮手法
Riding the Design Wave II
アスペクト指向プログラミングに 関する十の神話
Dynamic AOPと その実装手法について
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
情報伝播によるオブジェクト指向プログラム理解支援の提案
AspectScope によるアスペクトとクラスのつながりの視覚化
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
同期的にアドバイスを活性化できる分散動的アスペクト指向システム
UML入門 UML PRESS vol.1 より 時松誠治 2003年5月19日.
ユーザ毎にカスタマイズ可能な Web アプリケーション用のフレームワークの実装
アスペクト指向プログラミングを用いたIDSオフロード
効率的なJava Dynamic AOPシステムを実現する Just-in-Time weaver
アスペクト指向プログラミングと Dependency Injection の融合
遠隔ポイントカット - 分散アスペクト指向プログラミング のための言語機構
J2EEアプリケーションにおける アプリケーションレベルスケジューリング
契約に基づいたアスペクト指向リファクタリングの検証
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
ソフトウェア工学 知能情報学部 新田直也.
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
関心事ごとに視点を切り替えて プログラムを編集できる 統合開発環境の提案と実装
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
統合開発環境のための アスペクト指向システム
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
ユーザ毎にカスタマイズ可能な Webアプリケーションの 効率の良い実装方法
AspectScope による アスペクト指向プログラ ミングの支援
アスペクト指向に基づく 拡張可能な MDAモデルコンパイラ
横断的関心事に対応したオブジェクト指向言語GluonJとその織り込み関係の可視化ツール
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
Recoveryアドバイスをもつ アスペクト指向システム
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
プログラミング言語論 第十四回 理工学部 情報システム工学科 新田直也.
クラスのインターフェース やその振る舞いに及ぼすアスペクトの影響の解析と可視化
アスペクト指向言語のための 独立性の高いパッケージシステム
アスペクト指向言語のための 独立性の高いパッケージシステム
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
契約による クラスとアスペクト間の 影響解析
プログラムの織り込み関係を可視化するアウトラインビューの提案と実装
拡張可能なアスペクト指向モデリングにおける織り合わせの検証
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第十二回 知能情報学部 新田直也.
分散 Java プログラムのための アスペクト指向言語
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
Josh : バイトコードレベルでのJava用 Aspect Weaver
統合開発環境によって表現された 言語機構によるコードのモジュール化
IDE を活用した言語機構に頼らないコード再利用のためのモジュール化
同期処理のモジュール化を 可能にする アスペクト指向言語
設計情報の再利用を目的とした UML図の自動推薦ツール
様々なAOPメカニズムをモデル化する パラメータ化インタプリタ
アスペクト指向言語のための視点に応じた編集を可能にするツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
ソースコードの編集状況に応じた ソフトウェア部品の自動推薦システム
統合開発環境のための プログラミング言語拡張 フレームワーク
開発者との対話を活かした 横断的構造の表現
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第四回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

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>