Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "契約による クラスとアスペクト間の 影響解析"— Presentation transcript:

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

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

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

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

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

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

7 問題の具体例 簡易図形エディタ 図形が移動すると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

8 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

9 問題の具体例 問題点 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

10 問題の一般化 Line.moveByの振る舞いの一部 Weavingで振る舞いが追加 ↓ Weaving=振る舞いを変える作用 と見なせる
April 27, 2019 Suguru SHINOTSUKA

11 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

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

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

14 記述例 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

15 記述例 述語の定義 #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

16 記述例 述語の定義 #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

17 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

18 言語設計 基本述語セット 述語 意味 述語 意味 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

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

20 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

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

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


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

Similar presentations


Ads by Google