...

ソフトウェア科学入門 - Programming Logic Group

by user

on
Category: Documents
9

views

Report

Comments

Transcript

ソフトウェア科学入門 - Programming Logic Group
情報化社会
情報科学概論Ⅰ
ソフトウェア科学入門
z
コンピュータの進歩は日進月歩
z
ハードウェアの進歩
z
ドッグイヤー
ムーアの法則
様々な新しい情報機器の登場
z 家電の情報化
z 10年先どころか5年先も予想が難しい
情報化社会の鍵は?
z ソフトウェア
z
z
亀山 幸義
http://logic.cs.tsukuba.ac.jp/~kam
z
z
z
z
ソフトウェアの高機能化、高性能化、使いやすさの向上
あらゆる機器が情報化(知能化)される
情報化社会の弱点は?
z ソフトウェア
1
ソフトウェアがひきおこした
社会問題
z
2
インターネットを通じたソフトウェアの取得
枚挙に暇がない
z
z
z
z
z
z
z
Y2K(西暦2000年)問題
スペースシャトルの打上げ延期
銀行のオンラインシステム(ATM)のダウン
航空券の発券システムのダウン
携帯電話のたび重なる回収
Windowsシステムを狙ったウィルス
株取引の誤発注
インターネットで見つけたソフトウェアを使ったら、
自分のコンピュータがフリーズした。
3
ソフトウェア科学入門
「プログラムの論理」講義予定
ソフトウェア科学とは
z
ソフトウェアに対する2つの立場
z
z
z
z
z
アルゴリズム、ソフトウェア実装方式の研究
ソフトウェア検証、情報セキュリティの研究
仕様と正しさ
ソフトウェアの検証
3. プログラミング・パラダイム
ユーザインタフェースの研究
z
安定して、高い信頼性をもつソフトウェアの構成法
z
ソフトウェア作法
構造化プログラミング
ソフトウェアの正しさ
z
使いやすいソフトウェアの構成法
z
z
2.
高機能・高性能ソフトウェアの構成法
z
z
ソフトウェアの作り方に関する研究⇒ソフトウェア科学
ソフトウェア科学の目指すもの
z
動けばいいプログラムから良いプログラムへ
1.
ソフトウェアを作成し利用して、対象領域の問題を解く
ソフトウェア自身を研究対象とする
z
z
4
5
様々なプログラミング・スタイル
6
1
「普通」のプログラミング教育
「動けばいいプログラム」から
「良いプログラム」へ
z
習うこと
z
z
z
z
プログラム言語の構文、制御構造、データ構造
いろいろなアルゴリズム
とにかく指定された計算をするプログラムを書く技
あまり習わないこと
z
z
同じ問題を解くのにも、良いプログラムと悪いプログラ
ムがあること
良いプログラム、美しいプログラムを書く技
7
8
大昔に開発されたプログラムの一部
笑い話 ではない
[プログラミング作法より引用]
/* 国がシンガポールかブルネイか
ポーランドなら、現在の時間はオフフック時ではなく
応答時。。。
*/
、、、
}
z
携帯電話機の大量回収騒ぎの原因と噂されて
いる
9
プログラムには、
『良い』書き方がある!
良いプログラムとは?
z
「良いプログラム」のいろいろな定義
z
z
z
z
z
z
10
z
書けばいいってものではない
動けばいいってものでもない
z
どうすればよいか?
z
プログラムがしやすい。簡単に書ける。
実行速度が速い、実行時のメモリ使用量が少ない。
バグを見つけやすい
変更がしやすく拡張性に富む。
(ライバル会社にとって)わかりにくい。
定義1:読みやすいプログラムが良いプログラムである。
z
読みやすい=プログラムの動作が、プログラマ本人以外の人
にとって理解しやすい
11
12
2
参考図書
プログラミング・スタイルの第一歩
「プログラミング作法」
変数名や関数名のつけかた
z グローバルにはわかりやすい名前を、ローカル
には短い名前を
B. W. Kernighan, R. Pike著 福崎訳
アスキー、2000年
原題は “Practice of Programming”
Kernighan & Pike, Addison-Wesley,
1999.
cf. 「ソフトウェア作法」
Kernighan, Planger, 共立出版、1976
13
z
統一しよう
z
z
式と文
z プログラムの構造がわかるようにインデント(段
付け)しよう プログラムを美しく書こう!
関連のあるものには関連ある名前をつけよう
関数には能動的な名前を
z
z
14
ただし、真偽値を返す関数は戻り値を明確に表す名
前を
名前は的確に
z
間違った名前をつけるとバグの原因となる
15
z
自然な形の式を使おう
z
z
16
z
複雑な式は分解しよう
z
明快に書こう
z
副作用に注意
自分で音読するつもりで書こう。
かっこを使って、あいまいさを解消しよう。
17
18
3
コメント
z
その他(一般原則)
z
当たり前のことをコメントとして書くな
z
z
z
z
z
ちょっとした効率化より、読みやすさを重視せよ。
効率化は後ですればよい。
関数やグローバル変数には、コメントを書け
悪いプログラムにコメントを書くな。書き直せ。
コードと矛盾させるな。
19
20
プログラミング作法の効用
z
スタイルを守って書かれたプログラムは
z 読みやすく、理解しやすい
z プログラムのサイズも小さい
z
ソフトウェアの寿命
z
プログラミング作法の先へ
z
z
定義1:読みやすいプログラムが良いプログラム。
このプログラムはあと数年しか使わないと思っていても、その前提はく
つがえる。(cf 西暦2000年問題)
z
プログラミング・スタイルは自習できる
z
一度習得すれば、その後はほとんど時間はいらない
コード規約
z 多くのソフトウェア開発部隊(企業など)では、ある一定のパターンに従っ
てプログラミングをしなければいけない、という規約を定めている。
z
z
z
z
プログラミング作法だけで良いプログラムが書け
るか?
Edsger Dijkstra の定義
z
定義2:正しさを示しやすいプログラムが良いプログラ
ムである。
例: if 文のテスト部では、=による代入は使わない。
「動きさえすればよいプログラム」では、製品として認められない。
21
構造化されていないプログラムと
構造化プログラム
構造化プログラミング
z
構造化プログラミング
“Structured Programming”
by Dahl, Dijkstra, Hoare, 1972.
z
プログラミング言語論、プログラミング方法論の
源流
プログラムの構造化
データ構造化
階層的プログラミング
22
機械語(アセンブラ)のプログラム
のよう!
23
24
4
C言語で書いたプログラム
このプログラム(関数)は、
正しいだろうか?
「foo (x, y) は整数xを整数y
で割った商である」
正しいプログラムとは
NO!
foo (3, -2) の計算は止まら
ない
25
正しいソフトウェア(プログラム)とは
C言語で書いたプログラム
仕様
26
では、このプログラムは「正しく
ない」のだろうか?
NO!
「どんな整数 x と y に対しても
foo (x, y) は x を y で割っ
た商」は誤り
「どんな正の整数 x と y に対
しても foo(x, y) は x を y
で割った商」は正しい
z
z
z
プログラムだけをもってきて、正しいかどうかを判定する
ことはできない。
プログラムと(きちんとした)仕様が与えられれば、正し
いかどうかを判定することができる。
プログラムの仕様 (Specification)
プログラムに関する何らかの性質(成立することが期待される
性質)
例. 「正の整数 x を正の整数 y で割った商を返す」
参考. パソコンの「スペック」とは少し違う
Pentium 2GHz, Memory 512MB, etc.
z
27
プログラムの検証
z
28
プログラム検証に対する2大要求
プログラムが仕様に関して正しいことを厳密に保
証(証明)すること
z
厳密であること
「おおむね正しい」ことには意味がない
例:99%の入力値に対して正しく動作するプログラムは、
1ページに数十か所の誤植がある文章と同じ
z
z
できる限り自動的(機械的)であること
z
z
29
プログラムは次々と生産される
10年しか使われないプログラムの検証に10年を要
していたら…
30
5
形式仕様 (formal specification)
z
z
ソフトウェアの開発過程
(x=y*d+r)∧...
形式仕様:
形式言語(論理式)を使って記述した仕様
プログラム d = foo(x,y) の仕様は?
z
z
z
形式仕様
入力(input) は、正の整数 x と y
出力(output)は、0以上の整数 d
x, y, d の関係(入出力関係)を論理式で書く
Verification
要求
Validation
x = y×d + r
(x = y×d + r) ∧ (0 ≦ r < y)
∀x>0.∀y>0.∃d.∃r.
((x = y×d + r) ∧ (0 ≦ r < y))
プログラム
『割り算のプログ
ラムが欲しい』
int foo (int x, …) { … }
31
32
ソフトウェアへの信頼性向上への道
z
z
テストと検証は違う
z
テスト: いくつかのテストデータを入力して出力を
z
調べる
検証: どんな入力に対しても、ソフトウェアが与えら
れた仕様を満たすこと(正しいこと)を保証する
プログラムの検証
比較
z
z
z
「信頼性」に関しては「検証」アプローチが優れている
「コスト」については「テスト」アプローチが優れている
ソフトウェアの信頼性に対する要求が高まるにつれ、
「検証」アプローチの比重が少しずつ高まっている
33
w=x;
z=0;
34
仕様S1:
どんな正の整数x,yに対しても
ある整数 r に対して、
NO
x = y×foo(x,y)+r
かつ 0≦r< y
w>=y ?
YES
仕様S2:
Aにおいてx>0,y>0 ならば
Eにおいて
z=z+1;
w=w-y;
x = y×z+w かつ 0≦w< y
return z;
35
実は、S2からS1はいえない
(このことは、とりあえず、無視)
36
6
まずは素朴に…
発想を変えて
A: x>0, y>0
B: x>0, y>0, w=x, z=0
(1) もし、x<y ならば
whileループを実行しているときに
変わらない性質を考えてみよう。
E: x>0, y>0, w=x, z=0, x<y OK
ループを1回まわるごとに z が 1
増えて, w が y 減っている
⇒ z×y + w の値は変わらない
(2) もし、x≧y ならば
C: x>0, y>0, w=x, z=0, w≧y
D: x>0, y>0, w=x-y, z=1
(2-1) もし x-y < y ならば
ループを何回まわろうが、常に、
z×y + w = x が成立
E: x>0, y>0, w=x-y, z=1, x-y<y
OK
(2-2) もし、x-y ≧ y ならば‥
終わらない!
(ループ不変条件)
37
38
A
w=x;
z=0;
発想を変えて(2)
B
仮説: プログラムの制御がB, C, D,
E にあるときは、いつでも、
YES
C
証明: 以下の場合に上式が成立する
かチェックすればよい
z
z
z
z
z
初めてBに到達したとき
BからCに到達したとき
CからDに到達したとき
DからBに到達したとき
BからEに到達したとき
z×y+w=x
が
A,B,C,D,E
で成立
NO
w>=y ?
x = z ×y + w が成立する
z=z+1;
w=w-y;
E
D
return z;
39
発想を変えて(3)
B, C, D, E では、いつでも、
z×y + w = x が成立する
さらに Eへ到達したら w < y である。
40
残る問題:停止性
z
z
以上の事から、
E では、必ず、
z×y + w = x かつ w < y
を導くことができた。
(仕様S2の検証終了)
なんと、A で x>0, y>0という条件を使わ
41
ずに証明できた!(おかしい)
仕様S2:「プログラムの制御がEに行くならば○○○が
満たされる」ことは証明できた。
「プログラムの制御がいつか必ずEに行く」保証は、まだ
得られていない。
z
z
z
whileループは必ず終了するとは限らない。
実際、仕様S2の証明では、y>0という条件を使わなかったが、
この条件を使わないと、ループが終了することはいえない。
言葉
z
z
「停止するならば、正しい」と言う性質を「部分正当性」とよぶ。
停止性をこめた(本当の)正しさを、単に「正当性」とよぶ。強調し
て、「全正当性」とよぶことがある。
42
7
停止性の証明
ここまでのまとめ
数学的帰納法を使う。
任意のx>0、y>0に対して、このプロ
グラムは停止する。
0<x<yのとき
z
C言語などで書かれたプログラムの検証
z
whileループに1度もはいらず、停止
x≧yのとき
z
whileループを1度まわるとw=x-y
x-y<x なので、帰納法の仮定より
foo(x-y,y)が停止する
そのことを使えば、whileループを1
度まわったあとの計算が停止す
ることがいえる。
結局、foo(x,y)の計算が停止する。
部分正当性
z
プログラムの流れ(コントロール・フロー)を追いかける
z
ループ不変条件を発見することが鍵
停止性
z
帰納法を使う
Hoare論理 [Hoare 1969]
手続き型プログラム言語を検証するための論理
現在でも、検証の基礎となっている。
以上より、どんなx>0、y>0に対し
ても、foo(x,y)の計算は停止する。
43
次回の予告:
もっと検証しやすいプログラム言語は?
z
z
z
z
今日のまとめ
手続き型プログラム言語 (今回)
z
44
z
C言語、Java言語など
プログラムは、代入文などを次々と実行していくという形式で記
述される。
実行の流れを理解する必要がある。
z
z
z
宣言型プログラム言語 (次回)
z
z
z
関数型プログラム言語:Lisp/Scheme, ML, Haskell など
論理型プログラム言語: Prolog など
z
z
z
わかりやすいプログラムが正しいプログラムにつながる
プログラムの仕様、正当性、検証
z
関数あるいは論理式としてプログラムが記述される。
プログラムの実行の流れに関係なく、プログラムの意味を理解
することができる。
z
ソフトウェア科学の重要課題の1つ:信頼性
信頼性の第一歩:「良いプログラム」を書くこと
正当性は、仕様とプログラムに対して決まる概念
検証はテストとは異なる
検証の方法
スローガン
z
良いプログラムとは正しさの保証がしやすいプログラム
45
46
講義資料・質問・問合せ
今後の予定
亀山のホームページ
http://logic.cs.tsukuba.ac.jp/~kam
この授業の資料
上記ページ→教育→2006年度の授業
→情報科学概論1
質問等のあて先
kamのあとに@cs.tsukuba.ac.jp
総合研究棟B 1008号室
次回から2週間は久野先生担当です。
数理計画法(アルゴリズムの話)
亀山担当の次回は、3週先の9月29日です。
その際に、レポート課題を出します。
47
48
8
Fly UP