契約による クラスとアスペクト間の 影響解析

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.
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
シーケンス図の生成のための実行履歴圧縮手法
九州工業大学 情報工学部 知能情報工学科 鵜林尚靖 2004年10月15日
Riding the Design Wave II
九州工業大学 情報工学部 知能情報工学科 鵜林尚靖 2005年7月16日
アスペクト指向プログラミングに 関する十の神話
プログラミングパラダイム さまざまな計算のモデルにもとづく、 プログラミングの方法論 手続き型 関数型 オブジェクト指向 代数 幾何.
Dynamic AOPと その実装手法について
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
AspectScope によるアスペクトとクラスのつながりの視覚化
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
ユーザ毎にカスタマイズ可能な Web アプリケーション用のフレームワークの実装
効率的なJava Dynamic AOPシステムを実現する Just-in-Time weaver
アスペクト指向プログラミングと Dependency Injection の融合
遠隔ポイントカット - 分散アスペクト指向プログラミング のための言語機構
AOP言語への 織り込みインターフェイスの導入 A Weaving-Interface for AOP Languages
契約に基づいたアスペクト指向リファクタリングの検証
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
ソフトウェア工学 知能情報学部 新田直也.
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
アルゴリズムとプログラミング (Algorithms and Programming)
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
暗黙的に型付けされる構造体の Java言語への導入
関心事ごとに視点を切り替えて プログラムを編集できる 統合開発環境の提案と実装
{t-isio, kamiya, kusumoto,
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
統合開発環境のための アスペクト指向システム
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
Javaプログラムの変更を支援する 影響波及解析システム
AspectScope による アスペクト指向プログラ ミングの支援
アスペクト指向に基づく 拡張可能な MDAモデルコンパイラ
横断的関心事に対応したオブジェクト指向言語GluonJとその織り込み関係の可視化ツール
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
クラスのインターフェース やその振る舞いに及ぼすアスペクトの影響の解析と可視化
アスペクト指向言語のための 独立性の高いパッケージシステム
アスペクト指向言語のための 独立性の高いパッケージシステム
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
プログラムの織り込み関係を可視化するアウトラインビューの提案と実装
拡張可能なアスペクト指向モデリングにおける織り合わせの検証
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第十二回 知能情報学部 新田直也.
分散 Java プログラムのための アスペクト指向言語
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
Josh : バイトコードレベルでのJava用 Aspect Weaver
統合開発環境によって表現された 言語機構によるコードのモジュール化
IDE を活用した言語機構に頼らないコード再利用のためのモジュール化
同期処理のモジュール化を 可能にする アスペクト指向言語
様々な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:

契約による クラスとアスペクト間の 影響解析 篠塚 卓   鵜林 尚靖    四野見 秀明    玉井 哲雄   九州工業大学      IBM Japan, Ltd.   東京大学 April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp> 概要 目標 Weavingが意図どおり行われていることをサポートしたい Weavingされているプログラムを修正するリスクを軽減 より安全なアスペクト指向プログラミング(AOP) April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp> 概要 アプローチ Weavingの成立条件を指定可能にする(契約) Design by Contract(DbC)ライクな制約条件をWeavingに適用 事前条件: Weaving前に 事後条件: Weaving後に  プログラムが満たす性質 不変条件: 常に 契約記述言語を提案(COW) 制約条件 = プログラムの振る舞いの特徴 April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp> 説明の流れ 背景 問題の具体例 提案する手法 記述例 言語設計 実装 関連研究 まとめ April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp> 背景 AOPでは横断的関心事をモジュール化できる Classへ横断的関心事を織り込んで 実際に動作するプログラムを生成する OOPのClass Weavingされること を考えずに実装可能 = Obliviousness 横断的関心事=Aspect Weavingに関する記述は 全てAspect内にされる April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp> 背景 一方、Obliviousnessには問題点もある Weaving後のプログラムの動作が、Class定義を見ても分からない Aspect定義を見ても、それが分かるわけではない 実際のプログラムの動作を知るには、Weaving結果を予測するしかない ClassやAspectの実装を安易に変更すると、予期しないWeavingの影響が生じる可能性 April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

問題の具体例 簡易図形エディタ 図形が移動するとDisplayを1回だけupdate x, yは公開属性 x, yを直接使用 aspect UpdateSignaling { pointcut figureMoved(): execution(void Point.setX(int)) || execution(void Point.setY(int)) || execution(void Shape+.moveBy(int, int)); after(): figureMoved() { Display.update(); } x, yは公開属性 class Point implements Shape { int x, y; public int getX() { return x; } public int getY() { return y; } public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } public void moveBy(int dx, int dy) { x += dx; y += dy; } class Line implements Shape { private Point p1, p2; public Point getP1() { return p1; } public Point getP2() { return p2; } public void moveBy(int dx, int dy) { p1.x += dx; p1.y += dy; p2.x += dx; p2.y += dy; } interface Shape { public moveBy(int dx, int dy); } x, yを直接使用 April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp> 問題の具体例 Classの実装変更 公開されているx, yをprivate化 Line.moveByの修正が必要 直感的な対処: public void moveBy(int dx, int dy) { p1.moveBy(dx, dy); p2.moveBy(dx, dy); } April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

問題の具体例 問題点 Weavingされると: Display.updateが3回行われてしまう Point.moveBy public void moveBy(int dx, int dy) { p1.moveBy(dx, dy); p2.moveBy(dx, dy); } Weavingされると: Point.moveBy Line.moveBy Display.updateが3回行われてしまう Weavingが意図どおり行われなくなる しかも Class定義を見ただけではそのことは分からない 実行後にDisplay.updateが呼ばれる April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

問題の一般化 Line.moveByの振る舞いの一部 Weavingで振る舞いが追加 ↓ Weaving=振る舞いを変える作用 と見なせる April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp> 提案する手法 ClassとAspect間の契約によるWeaving 正しいWeavingが行われた場合の振る舞いをClassとAspectが互いに約束しあう Class Weaving後の振る舞いをAspectに約束してもらう Weavingの事後条件 Aspect Weaving前のClassの振る舞い方を約束してもらう Weavingの事前条件 April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

提案する手法 事前・事後条件 プログラムの振る舞い方として指定 制御やデータのフローで表現可能 例: Line.moveByの制御フローの一部 April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp> 提案する手法 COW (Contract Writing language) Weavingの事前・事後条件を制御・データのフローが持つ性質として記述可能にする 一階述語論理での記述(基本述語セットを提供) April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

記述例 LineとUpdateSignalingの契約 事前条件: x, yフィールドへの書き込みを行う 事後条件: 事前条件+Display.updateを1回呼び出す contract ForLine between class Line, aspect UpdateSignaling { void moveBy(int dx, int dy) requires(Writing.to(Point.x) && Writing.to(Point.y)); ensures(Writing.to(Point.x) && Writing.to(Point.y) && Updating.once()); } LineとUpdateSignaling間に ForLineという契約を結ぶ Line.moveByに対する制約条件を記述 事前条件:Point.xとPoint.yへの 書き込みを指示 事後条件:事前条件+Display.updateを 1回行うことを指定 April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

記述例 述語の定義 #1 Writing.to(v): 制約条件の適用先メソッドがvに書き込みする tが条件適用先のメソッド contract Writing { define to(v) { target(t) && Statement.of(t, s) && write(s, v) } tが条件適用先のメソッド sがvに書き込みする ∃t, ∃s, ∃v [target(t) ∧ Statement.of(t, s) ∧ write(s, v)] Statement.of(m,s): メソッドm以下の制御フロー上で到達可能なステートメントがs contract Statement { define of(m, s) { entry(m, e) && controlFlow(m, s, e) } メソッドmの入口がe メソッドm以下の制御フロー上で eから到達可能なステートメントがs ∃m, ∃e, ∃s [entry(m, s) ∧ controlFlow(m, s, e)] April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

記述例 述語の定義 #2 Updating.called(): 条件適用先のメソッド内で Display.updateが呼ばれる contract Updating { define called() { target(t) && Statement.of(t, s) && call(s, void Display.update()) } define moreThanOne() { target(t) && Statement.of(t, s1) && Statement.of(t, s2) && controlFlow(t, s2, s1) && ! equal(s1, s2) && call(s1, void Display.update()) && call(s2, void Display.update()) define once() { Updating.called() && ! Updating.moreThanOne() Updating.moreThanOne(): 条件適用先メソッド 内でDisplay.update()が複数回呼ばれる Updating.once(): 条件適用先メソッド内で Display.update()が1回だけ呼ばれる April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp> 記述例 正しいWeavingへの貢献 ForLine契約 Line.moveByに以下を指示 Weaving前: Pointのx, yフィールドに書き込みする Weaving後: フィールド書き込みは変わらず、Display.updateを1回だけ呼び出す Line.moveByの実装修正 Display.updateを3回呼び出す 契約違反(コンパイルエラーとして検出) April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

言語設計 基本述語セット 述語 意味 述語 意味 entry (a, s) call (s, a) target (a) sはあるActuator aのエントリ call (s, a) ステートメントsがあるActuator aを呼ぶ return (s) sはreturnステートメント write (s, v) ステートメントsが変数vに書き込む read (s, v) ステートメントsが変数vを読み込む controlFlow (a, g, s) Actuator a以下で、ステートメントsからgへの制御フローがある controlDependence (a, g, s) Actuator a以下で、ステートメントsからgへ制御依存関係がある dataDependence (a, g, gv, s, sv) Actuator a以下で、ステートメントgで読まれる変数gvは、ステートメントsで書かれる変数svからデータ依存関係を受ける equal (x, y) xとyは等価 true 常に真 false 常に偽 述語 意味 target (a) aが制約条件適用先のActuator(※1) source (a) aがtargetに織り込まれるアドバイス method (a) aはあるメソッド constructor (a) aはあるコンストラクタ beforeAdvice (a) aはあるbeforeアドバイス afterAdvice (a) aはあるafterアドバイス aroundAdvice (a) aはあるaroundアドバイス field (v) vはあるクラスフィールド argument (v) vはあるメソッド引数 variable (v) vはあるローカル変数 ※1: メソッド、コンストラクタ、アドバイスの総称 (Martin Rinardによる) April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp> 実装 COW言語処理系の構成 出力ストリーム COW 検証結果 変換ルール Parser 契約情報 処理系 プロセッサ 検証内容 Prolog プログラム スライシング情報 検証結果 Prolog インタプリタ Java AspectJ CFG/PDG生成系 実行例: April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp> 関連研究 Aspect-aware interface [G. Kiczales, ICSE2005] Weavingの範囲をOOPインターフェースに含める試み Classification system [M. Rinard, FSE2004] Weavingが振る舞いに与える影響の定性的分類 Open module [J. Aldrich, ECOOP2005] Join pointを隠蔽できる型システム Crosscutting programming interface [K. Sullivan, FSE2005] AOP環境でクラスとアスペクトを設計するルールを記述 April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

関連研究 比較 AAIF Classification Open Module XPI COW Weaving範囲の限定 ○ ー △ 影響分析 設計ルール 従来の方法論を「振る舞いに注目した契約」として統合できる可能性 April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>

Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp> まとめ COWは制御・データのフローの特徴をWeavingの事前・事後条件として記述可能 Weavingに対する事前・事後条件の適用 正しく実装されているClassが、Aspectから正しくWeavingを受けることを支援する April 27, 2019 Suguru SHINOTSUKA <sinotuka@minnie.ai.kyutech.ac.jp>