豊富な情報を基にした pointcut を記述できるアスペクト指向言語

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

関心事指向アーキテクチャモデリング環 境 Concern-oriented Architecture Modeling Environment 九州工業大学大学院情報工学府 情報科学専攻 鵜林研究室 M1 佐藤 友紀 1.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
アスペクト指向プログラミングに 関する十の神話
Dynamic AOPと その実装手法について
アルゴリズムとプログラミング (Algorithms and Programming)
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
AspectScope によるアスペクトとクラスのつながりの視覚化
同期的にアドバイスを活性化できる分散動的アスペクト指向システム
ユーザ毎にカスタマイズ可能な Web アプリケーション用のフレームワークの実装
アスペクト指向プログラミングを用いたIDSオフロード
効率的なJava Dynamic AOPシステムを実現する Just-in-Time weaver
アスペクト指向プログラミングと Dependency Injection の融合
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
遠隔ポイントカット - 分散アスペクト指向プログラミング のための言語機構
AOP言語への 織り込みインターフェイスの導入 A Weaving-Interface for AOP Languages
コンパイラの解析 (2) GCJのデータ構造 - 1.
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
プログラミング言語入門 手続き型言語としてのJava
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
複数個のJoinpointの集合を 対象としたPointcutを 記述可能なアスペクト指向言語
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
統合開発環境のための アスペクト指向システム
ユーザ毎にカスタマイズ可能な Webアプリケーションの 効率の良い実装方法
Javaプログラムの変更を支援する 影響波及解析システム
AspectScope による アスペクト指向プログラ ミングの支援
アスペクト指向に基づく 拡張可能な MDAモデルコンパイラ
横断的関心事に対応したオブジェクト指向言語GluonJとその織り込み関係の可視化ツール
既存Javaプログラム向け 分散化支援システムの開発
Recoveryアドバイスをもつ アスペクト指向システム
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
クラスのインターフェース やその振る舞いに及ぼすアスペクトの影響の解析と可視化
アスペクト指向言語のための 独立性の高いパッケージシステム
アスペクト指向言語のための 独立性の高いパッケージシステム
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
契約による クラスとアスペクト間の 影響解析
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
分散 Java プログラムのための アスペクト指向言語
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
Josh : バイトコードレベルでのJava用 Aspect Weaver
統合開発環境によって表現された 言語機構によるコードのモジュール化
IDE を活用した言語機構に頼らないコード再利用のためのモジュール化
同期処理のモジュール化を 可能にする アスペクト指向言語
アスペクト指向言語のための視点に応じた編集を可能にするツール
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
プログラム分散化のための アスペクト指向言語
開発者との対話を活かした 横断的構造の表現
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

豊富な情報を基にした pointcut を記述できるアスペクト指向言語 東京工業大学大学院 情報理工学研究科 数理・計算科学専攻 千葉研究室 02M37220 中川 清志 Feb. 6, 2004 2003年度 修士論文発表会

アスペクト指向(AOP) オブジェクト指向の限界 アスペクト指向の利点 ある種の処理は複数クラスに散らばる ロギング,同期,永続性などの処理 そのような処理をアスペクトとしてモジュール化 クラスとアスペクトは分離して記述 オブジェクト指向を補完 Feb. 6, 2004 2003年度 修士論文発表会

AOPの目標:図形エディタの例 目標: 「図形の外観変化を起こすメソッド」 の後にScreenを更新したい Screen 図形クラスからScreen更新命令  最終的には図形クラス内の  draw() メソッドが呼ばれる FigureElement draw() Point Line int x, y Point p1, p2 getX() getY() setX(int) setY(int) move(int,int) draw() getP1() getP2() setP1(Point) setP2(Point) move(int,int) draw() これらのメソッドの最後には Screenを更新するコードが必要 今のところアスペクトとクラスはバラバラに記述しておく Feb. 6, 2004 2003年度 修士論文発表会

AOPの目標:図形エディタの例 「従来の方法では」 void setP1(Point newP) { p1 = newP; } void move(int dx, int dy) { p1.move(dx, dy); p2.move(dx, dy); } screen.update(); 更新のための命令が 各クラス、メソッドに散らばってしまう 保守性・再利用性が悪い FigureElement draw() screen.update(); Point Line void setX(int newX) { x = newX; } void move(int dx, int dy) { x += dx; y += dy; } int x, y Point p1, p2 screen.update(); getX() getY() setX(int) setY(int) move(int,int) draw() getP1() getP2() setP1(Point) setP2(Point) move(int,int) draw() 今のところアスペクトとクラスはバラバラに記述しておく screen.update(); Feb. 6, 2004 2003年度 修士論文発表会

AOPの目標:図形エディタの例 「AOPでは」 void setP1(Point newP) { p1 = newP; } void move(int dx, int dy) { p1.move(dx, dy); p2.move(dx, dy); } screen.update(); screen.update(); 更新のための命令 を分離して記述 処理系 weaver により合成 アスペクト:  これらのメソッドの  最後には  screen.update() を  実行せよ FigureElement draw() Point Line void setX(int newX) { x = newX; } void move(int dx, int dy) { x += dx; y += dy; } int x, y Point p1, p2 getX() getY() setX(int) setY(int) move(int,int) draw() getP1() getP2() setP1(Point) setP2(Point) move(int,int) draw() 今のところアスペクトとクラスはバラバラに記述しておく Feb. 6, 2004 2003年度 修士論文発表会

AOPの目標:図形エディタの例 「AOPでは」 void setP1(Point newP) { p1 = newP; } void move(int dx, int dy) { p1.move(dx, dy); p2.move(dx, dy); } screen.update(); screen.update(); 更新のための命令 を分離して記述 処理系 weaver により合成 アスペクト:  これらのメソッドの  最後には  screen.update() を  実行せよ FigureElement draw() weaver Point Line void setX(int newX) { x = newX; } void move(int dx, int dy) { x += dx; y += dy; } int x, y Point p1, p2 「どこに合成したいか?」を どのように指示するかが問題!! getX() getY() setX(int) setY(int) move(int,int) draw() getP1() getP2() setP1(Point) setP2(Point) move(int,int) draw() 今のところアスペクトとクラスはバラバラに記述しておく Feb. 6, 2004 2003年度 修士論文発表会

AspectJ*における 合成箇所の指定方法の問題点 コードを挿入するメソッドを 全て書き並べる必要あり しかし、保守性・再利用性が悪い 見落とす可能性がある 例えばLine.rotate(..)というメソッド メソッドの追加、 名前変更などに弱い FigureElement call(void Point.set*(int)) || call(void Point.move*(..)) || call(void Line.set*(Point)) || call(void Line.move*(..)) draw() Point Line int x, y Point p1, p2 getX() getY() setX(int) setY(int) move(int,int) draw() getP1() getP2() setP1(Point) setP2(Point) move(int,int) draw() Feb. 6, 2004 2003年度 修士論文発表会 * Kiczales等 ECOOP1997

必要とされる合成箇所の指定方法 深い情報を基にして、コードを挿入 するメソッドを指定したい メソッド名を 書き並べなくてもよい FigureElement 「“draw”メソッドの中で読み込まれるフィールドのどれか」をそのボディ中で更新するような、“Point”クラス内の全てのメソッド draw() Point Line int x, y Point p1, p2 getX() getY() setX(int) setY(int) move(int,int) draw() getP1() getP2() setP1(Point) setP2(Point) move(int,int) draw() つまりは赤い 枠内のメソッド Feb. 6, 2004 2003年度 修士論文発表会

pointcut の記述力が高い AOP言語 Josh Java で拡張 リフレクションの使用 Javassist[Chiba00] を使用 汎用的な「何を合成するか」の記述 合成箇所の情報を利用したインタータイプ宣言 「本研究の提案:AOP言語Josh」 本発表は、前者の「pointcut」についてのみ説明する Feb. 6, 2004 2003年度 修士論文発表会

pointcutのメカニズム アスペクトの合成場所の指定 言い換え: joinpoint (実行点)の選別作業 例: プログラム joinpoint メソッド呼び出し フィールド参照 インスタンス生成 etc. アスペクトの合成場所の指定 言い換え: joinpoint (実行点)の選別作業 条件と対象joinpoint のペア 例: 「setXという名前の」 メソッド呼び出し 「Lineクラスの」フィールド参照 プログラム この箇所にアスペクト 合成決定!! 対象 joinpoint 条件:名前が setX pointcut Feb. 6, 2004 2003年度 修士論文発表会

pointcut の記述方法 pointcut 指定子を使い記述 例:call (“void *.setX(..)”) 指定子は、対象joinpoint と選別方針を持つ 例:call (“void *.setX(..)”) 「void 型の“setX”で引数とクラス名は任意」という メソッド呼び出しを指定 call は pointcut 指定子で、メソッド呼び出しが対象 カッコ内は条件 Joshのポイントカット記述 AspectJの真似 足りないものはJavaで書く Feb. 6, 2004 2003年度 修士論文発表会

Josh が提供する 強力な pointcut の原理 pointcut指定子をユーザが新たにJavaで定義可能 joinpoint の選別方針をJavaで定義 従来は言語組み込みの指定子のみ使用可 joinpoint をJavaのオブジェクトで表現して公開 そのjoinpointの情報を得るメソッドを提供 リフレクションを使い豊富な情報を入手 Feb. 6, 2004 2003年度 修士論文発表会

pointcut指定子  boolean 型メソッド before : call (“void Point.setX()”) { /* アドバイスボディ */ } pointcut 指定子を boolean 型のメソッド呼び出しへ変換 新たに boolean メソッドを 定義すれば指定子として使用可能 コード変換器 アドバイスボディとは 指定された箇所で実行される コード断片 if ( call( jp, “void Point.setX()”, jc)) { /* アドバイスボディ挿入 */ } jp : Java で表現された   joinpoint のオブジェクト jc : joinpoint に   関連する情報を持つ Feb. 6, 2004 2003年度 修士論文発表会

新たなpointcut指定子の定義例(1/2) [引数の決まりごと] 使用例:  simpleCall(“setX”) 例:simpleCall という pointcut指定子を定義 第一引数で対象とする joinpointを指定 ここではメソッド呼び出し Stringの配列で、 条件を受け取る args[0] = “setX” JoshContext は有用な 情報を保持 static boolean simpleCall (MethodCall m,String[] args, JoshContext jc) { String name1 = m.getMethodName(); String name2 = args[0]; return name1.equals(name2); } 内容:メソッド呼び出しの中で、メソッド名が “setX”というものを選別する Feb. 6, 2004 2003年度 修士論文発表会

新たなpointcut指定子の定義例(2/2) [ボディの記述] 使用例:  simpleCall(“setX”) name1 : このメソッド呼び出しjoinpoint において、呼び出された メソッド(callee)の名前 joinpointオブジェクト から入手 name2 : この例では name2 = “setX” name1とname2が 一致したら真を返す static boolean simpleCall (MethodCall m,String[] args, JoshContext jc) { String name1 = m.getMethodName(); String name2 = args[0]; return name1.equals(name2); } 内容:メソッド呼び出しの中で、メソッド名が “setX”というものを選別する Feb. 6, 2004 2003年度 修士論文発表会

複雑なpointcut指定子の定義例 [図形エディタ問題の解決] updater 指定子を定義 図形エディタの問題を解決 リフレクションの使用 より深い情報を得られる static boolean updater(MethodCall mc, String[] args, JoshContext jc) { CtClass root = jc.getCtClass(args[0]); String mname = args[1]; Hashtable fields = enumerateFields(root, mname); CtMethod mth = mc.getMethod(); mth.instrument(new ExprEditor() { public void edit(FieldAccess expr) { String name = expr.getFieldName(); if (expr.isWriter() && fields.get(name) == expr.getCtClass()) return true; } return false; } 内容:「drawメソッドで読み込まれる フィールドを更新する」 メソッド呼び出しを選別する 使用例:updater(“Point”, “draw”) Feb. 6, 2004 2003年度 修士論文発表会

Josh 処理系の全体図 weaver コード変換器 .josh 独自言語で書いた .class アスペクト埋め込みの ターゲット pointcut 指定子の定義 pointcut の使用 & アドバイス .class アスペクトとクラス の両方の機能 Feb. 6, 2004 2003年度 修士論文発表会

比較実験 実験内容 実験環境 Josh と AspectJ の 性能比較 weave時間 weave済みプログラムの実行時間 SunBlade1000 UltraSPARC-III 750MHzX2, Memory 1GB Solaris8 Sun JDK 1.4.0_01, AspectJ 1.1b2 AspectJ 1.1b2 Feb. 6, 2004 2003年度 修士論文発表会

実験(1) 結果 weave 対象:XML解析器 Xerces アスペクト:全ての public メソッド呼び出しの前にカウンタをいれる Josh の方が weave 時間は少ないが 実行時オーバヘッドがある コード長が大きくなっている アドバイスをインライン展開しているため コンパイル +weave(秒) 実行(ミリ秒) コード長(KB) オリジナル 36.2(javacのみ) 408 1928 Josh 77.7(69%) 1106(130%) 4269(153%) AspectJ 112 881 2787 早い遅いの理由を言う Feb. 6, 2004 2003年度 修士論文発表会

実験(2) 結果 weave対象:JavaGrande ベンチマークプログラム アスペクト:あるクラスのオブジェクトを対象とした メソッド呼び出しの前にカウンタをいれる 結果 先ほどと同様に、Josh は weave 時間が少ないが 実行時オーバヘッドがある AspectJ は最適化に力をいれているため [秒] weave 時間  Josh  AspectJ [秒] 実行時間 Feb. 6, 2004 JavaGrande ベンチマークの種類 2003年度 修士論文発表会

関連研究 アスペクト指向言語 pointcut の拡張 AspectJ Hyper/J Composition Filters Brichau等 [GPCE2002] Gybels等 [AOSD2003] Feb. 6, 2004 2003年度 修士論文発表会

まとめ アスペクト指向言語 Josh を提案 [AOSD2004] Josh の性能を AspectJ と比較 pointcut に関して高い記述力を持つ pointcut 指定子を新たに Java で定義できる 複雑な pointcut が可能 汎用的な指定子は組み込みで与える 複雑なものだけを自分で定義すればよい Josh の性能を AspectJ と比較 コンパイル時間は少ないが、 実行時のオーバヘッド有り Feb. 6, 2004 2003年度 修士論文発表会