SIGSS 2012年1月研究会 in 高知 アーキテクチャ点写像による 設計・コード間の双方向追跡 〜 SMTソルバーを用いた設計追跡性の検証 〜 鵜林 尚靖 (九州大学) 亀井 靖高 (九州大学) 2012年1月26日 概要: アーキテクチャ点とアーキテクチャ点写像 SMT ソルバー 追跡性の保持が困難 public class Subject{ private Vector observers = new Vector(); private String state = “”; public void addObserver(Observer o){ … } public void removeObserver(Observer o){ … } public void notify(){ Iterator i = observers.iterator(); while(i.hasNext() ){ Observers o = (Observer)i.next(); o.update( this ); } } public void setState(String s){ state = s; } public String getState() {return state; } } 適切な抽象度を保持した アーキテクチャ設計とコード の同期(双方向追跡) 2 発表内容 研究の背景と目的 アーキテクチャ点とその写像 SMTベースの追跡性検証 まとめと今後の課題 3 研究の背景と目的 4 ソフトウェアアーキテクチャとは? Bass, L. らによる定義 The software architecture of a program or computing system is the structure or structures of the system, which comprise of software elements, the externally visible properties of those elements, and relationships among them. アーキテクチャ設計はソフトウェア開発において重 要な役割を果たす 保守性や信頼性などの主要ソフトウェア品質特性は アーキテクチャ設計の善し悪しに依存する Bass, L., et al.: Software Architecture in Practice, Addison-Wesley, 2003. 5 ソフトウェアアーキテクチャの課題 設計者の意図を正確に記述すること コードとの一貫性を保つこと 設計とコードの同期を取ること public class Subject{ private Vector observers = new Vector(); private String state = “”; public void addObserver(Observer o){ … } public void removeObserver(Observer o){ … } public void notify(){ Iterator i = observers.iterator(); while(i.hasNext() ){ Observers o = (Observer)i.next(); o.update( this ); } } public void setState(String s){ state = s; } public String getState() {return state; } } Adequate support for moving from architecture to implementation and fluidly moving between design and coding tasks. Taylor, R. N. and Hoek, A.: Software Design and Architecture -The once and future focus of software engineering, In Proceedings of 2007 Future of Software Engineering (FOSE 2007), pp.226-243, 2007. 6 例題: Observer パターン アーキテクチャ制約 クラス図 相互作用図 7 このコードはアーキテクチャに 適合しているであろうか? 正しく動作はする! クラス図とも対応している! しかし。。。 設計には適合していない! 正しい実装 8 アーキテクチャ設計の詳細化による解法 一つの解決策としてはアーキテクチャの詳細化がある public class Subject{ private Vector observers = new Vector(); private String state = “”; public void addObserver(Observer o){ … } public void removeObserver(Observer o){ … } public void notify(){ Iterator i = observers.iterator(); while(i.hasNext() ){ Observers o = (Observer)i.next(); o.update( this ); } } public void setState(String s){ state = s; } public String getState() {return state; } } 完全なコードを生成 しかし、アーキテクチャ設計は抽象的でなければならない 9 我々のアプローチ: Archface アーキテクチャデザイン アーキテクチャの設計 変更の反映 Archface プログラム点の公開と連結 アーキテクチャの変更 アーキテクチャの 正しい実装 public class Subject{ private Vector observers = new Vector(); private String state = “”; … } コード Naoyasu Ubayashi, Jun Nomura, and Tetsuo Tamai: Archface: A Contract Place Where Architectural Design and Code Meet Together. 32rd ACM/IEEE International Conference on Software Engineering (ICSE 2010), ACM PRESS, pp.75-84 (2010). 10 本発表 – 同期のための検証機構 基本アイデア アーキテクチャ点(Archpoint) アーキテクチャ設計の本質部分を表現するための「設計上の点」 コンポーネント間の構造やメッセージ相互作用などのアーキテクチャを表現 アーキテクチャ点写像(ArchMapping) 設計追跡性を実現するための機構 例:「メッセージ送信イベント」等のアーキテクチャ点は「メソッド呼び出 し」等のプログラム点に写像される アーキテクチャ点が整合性を保ちつつプログラム点に 写像されているか否かを確認することにより検証 SMTソルバーによる検証 11 アーキテクチャ点とその写像 12 アーキテクチャ点と アーキテクチャ点写像 SMT 今回は振る舞いの観点 ソルバー から アーキテクチャ点写像 を紹介 適切な抽象度を保持した双方向の同期 13 双模倣関係による同期 アーキテクチャ点の観点で設計とコードの間に双模 倣(bisimulation)関係が存在すれば、両者の間の 追跡性は保持される アーキテクチャ点とその出現順序に注目する限り、 設計とコードが振る舞い上区別できなければ、両者 は同期していると見なすことができる アーキテクチャ点の系列をLTS(Labelled Transition System)と見なすと、プロセスだと考え ることが可能 14 双模倣関係による同期(つづき) 抽象度の保持=アーキテクチャ点に基づく双模倣 15 Archface から論理式への変換 cObserver コンポーネントインタフェース cSubject コンポーネントインタフェース アーキテクチャ設計 論理式 cObserverPattern コネクタインタフェース 16 アーキテクチャの論理式表現 アーキテクチャを アーキテクチャ点の集合と要素間の制約(論理式) で表現 [List 3] Observer_Pattern := sequence( ; [predicate] cSubject_setState_message_receive, ; archpoint cSubject_notify_message_send, ; archpoint cSubject_notify_message_receive, ; archpoint iteration( ; [predicate] cSubject_update_message_send, ; archpoint cObserver_update_message_receive, ; archpoint cObserver_getState_message_send, ; archpoint cSubject_getState_message_receive)) ; archpoint 17 プログラムコードの論理式表現 プログラムコード(の制御フロー)を プログラム点の集合と要素間の制約(論理式) で表現 [List 4] Program_List1 := sequence( cSubject_setState_execution, iteration( cSubject_size_call, Vector_size_execution, cSubject_get_call, Vector_get_execution, cSubject_update_call, cObserver_update_execution, cObserver_getState_call, cSubject_getState_execution, cObserver_println_call, System_out_println_execution)) ; [predicate] ; program point ; [predicate] ; program point ; program point ; program point ; program point ; program point ; program point ; program point ; program point ; program point ; program point 18 アーキテクチャ点写像と追跡性検証 アーキテクチャ点写像 refine 追跡性検証 例題の場合は 充足しない! コードが設計に 適合していない! 19 SMTベースの追跡性検証 20 SMT(背景理論付きSAT) SMTはSAT(Boolean satisfiability)を一般化。 背景理論 等号と未解釈関数の理論 自然数・整数・有理数・実数 配列の理論 再帰データの理論 Yices は代表的なSMTソルバーの一つで論理式の充足 可能性を判定する。 Yices: http://yices.csl.sri.com/ 21 Yices エンコーディング 順序保持 アーキテクチャ点の系列 は 配列でエンコーディング 22 検証例 – モデル検査 振る舞い検証(検証したい性質をLTLで記述) Yices エンコーディング 有界モデル検査 23 まとめと今後の課題 24 まとめと今後の課題 まとめ アーキテクチャ点とアーキテクチャ点写像を提案 適切な抽象度を保ちつつ、設計とコードを同期 今後の課題 現状はアーキテクチャ点とプログラム点が 1 対 1 に 対応する場合のみサポート 今後、1 対 N および N 対 1 の場合をサポート 1対N: N対1: 一つのアーキテクチャ点が複数のプログラム点に対応する場合 複数のアーキテクチャ点が一つのプログラム点に対応する場合 25 ご清聴ありがとうございました 26
© Copyright 2024 ExpyDoc