alloy analyzer
Post on 19-Jul-2015
277 Views
Preview:
TRANSCRIPT
Alloy AnalyzerはMITで開発されたオープンソース(MITライセンス)のJava製GUI付き仕様記述・検証ツール。
B, Z, VDMのようなツールは仲間。
2006年頃から公開されており、Version 4で解析速度向上、文法のブラッシュアップ。
2011年8月現在Version 4.1.10が最新(4.2 RCあり)。
Alloy Analyzerとは
開発者のDaniel Jackson@MIT
簡素な言語で仕様を記述すると、その仕様を満たす状態を検索して図示してくれる(モデルファインダー)。
検証したい性質を記述すると、その性質が満たされるかどうか全自動でチェックしてくれる。
Alloy Analyzerの検証は全自動
V字モデル
高効率・高信頼なソフトウェア開発のための関数プログラミングと形式手法
10
要求分析
システム設計
詳細設計
モジュール実装
受け入れテスト
システムテスト
結合テスト
単体テスト
このフェーズで嬉しい
Alloyではこう書けます
sig Company, Person {} // 企業と従業員
one sig Employ {employee : Company -> set Person // 雇用関係
}
モデルの修正
sig Company, Person {} // 企業と従業員
one sig Employ {employee : Company lone -> set Person// 雇用関係
}
一人の人が複数の企業に雇われないように。 従業員は0人以上。
1対nの関係のバリエーション
sig Company, Person {} // 企業と従業員
one sig Employ { // 雇用関係employee : Company lone -> set Person
}
lone(0か1)one(1のみ)
set(0以上)some(1以上)
一口に1対nの関係といっても、厳密にはいくつかの種類が考えられる。n対nはもっと種類が多い。
複雑なデータを扱うときは、しっかりとモデリングしておかないと、後工程での手戻りが高コストとなる。
Alloyを使ってモデルを記述すると、意図したモデリングができているかどうか、サンプル図を見ながらチェックできる。
完成したAlloyコードとサンプル図を設計書に張っておくと効果的。
サンプル図でチェック!
陶器の窯元さんは自社で陶器を制作している。
ただ、個別に売っていては効率が良くないので、窯元さんが何社も集まって、一つの陶器カタログを作る。
そのカタログをホテルや外食産業に配布して、カタログを見て注文してもらう。受注は、カタログに参加している窯元さんがそれぞれ受ける。
窯元さんは受注を受けた時に、自社製品以外の注文は、カタログ参加窯元に仕入発注を出して対応する。
ケーススタディ陶器のカタログ販売
窯元さんの製品は必ず一社オリジナル?同じ製品を二社以上が作っていることは無い?
カタログに載せる製品は参加窯元さんの全ての製品?それとも一部だけ?
仕様を記述する過程で疑問に思った事
sig Maker {products: disj set Product // 自社製品
}
// 商品はカタログ参加企業の商品products in member.products
シンプルな仕様だと思っていても、書き下してみると意外と曖昧さが残っている。
Alloyで仕様を記述する事で、簡単に曖昧性が浮き彫りになる。
プログラムを書くわけではないので、実装の詳細には縛られずに、仕様だけを表現できる。
仕様記述で仕様の穴を早期に見つける
読み込み権限があるファイルのみ読み込み可能、書き込み権限があるファイルのみ書き込み可能とする簡易ファイルシステムを考えてみる。
権限を勝手に変えられると元も子もないので、権限変更フラグも用意する。権限変更フラグがあるファイルの権限のみ、読み込み・書き込み権限を含めて、変更できる。
手続きの検証例ファイルシステムの権限
木構造のファイルシステムと4つの操作(新規作成、コピー、削除、権限変更)をモデル化。
各操作を実行する前に権限をチェック。
Alloyによるモデル化
abstract sig Elem {// 全てのファイルシステムエレメントには権限が設定されている。permission : Permission
}sig File extends Elem {contents : Contents // ファイルには内容がある。
}sig Dir extends Elem {} // ディレクトリ。子要素は別途定義する。
Alloyによるモデル化操作定義と権限チェックの実施
//オペレーション定義abstract sig Operation {}sig Create extends Operation { target : Path } //新規作成sig Copy extends Operation { disj src, dst : Path } //コピーsig Delete extends Operation { target : Path } //削除sig Chmod extends Operation { target : Path, perm : Permission } //権限変更
//抜粋else #(Chmod & x.command) > 0 => {
let c = (x.command <: Chmod), s = x.state {exists[s, c.target]getElem[s, c.target].chmodable //変更権限があるか?
}}
検証したい性質の記述
pred PermissionConsistency {some x : StateTrans | some y : x.^next | some p : sameFiles[x.state, y.state] | let xe = getElem[x.state, p], ye = getElem[y.state, p] |
xe.contents = ye.contents and xe.permission.perm = none and // 権限変更できないはずなのにye.permission.perm = P // できたりしないよね?
}
権限変更フラグが立っていないファイルをどう操作しても、権限変更フラグを立てた状態にはできない。(フラグを立てた状態に至るパスを見つけろ)
少し複雑な組合せ問題になると、人間はすぐに見落としをしてしまう。
Alloyは網羅的にチェックしてくれるので、人間が見落としがちなケースもカバーしてくれる。
記述に慣れてくれば、比較的短時間にモデルを構築できる。
アルゴリズムが少し変更になったとき、Alloyのモデルがあれば簡単に回帰チェックができる。
手続きの検証
ホテルの客室施錠問題。
DNSのモデル化と検証。
バージョン管理システムのモデル化と検証。
メモリキャッシュ戦略のモデル化と検証。
コミットプロトコルのモデル化と検証。
タスクのスケジューリング問題。
数独、連立方程式、正直うそつきパズル。
手続きのモデル化と検証その他の例
Alloy AnalyzerはMITで作られたオープンソースの仕様記述・検証ツール。
決められたスコープ内での網羅的全自動チェックが可能。
正確なデータモデリングの支援、仕様記述による曖昧さの早期発見、複雑な手続きの検証など、使い方次第で様々な利点が得られる。
日本語の情報源も登場!応用を始めるには良い時期。
まとめ
情報源(4):書籍
抽象によるソフトウェア設計-Alloyではじめる形式手法Daniel Jackson (著), 中島震 (監訳), 今井健男 (翻訳), 酒井政裕 (翻訳), 遠藤侑介 (翻訳), 片岡欣夫 (翻訳) オーム社
top related