Software Engineering Lecture 4/25
Software Engineering Lecture 4/25
ソフトウェア工学の基礎となるもの
プログラムとは何か? プログラムを書くということはどういうことか?
- 何を作りたいのか
- どうやって作るのか
- 何を作ったのかが
自分で作ったものを自分で使うだけではない。
- 他人に作ってもらう
- 今あるものを作り直す
- 自分で作ったものを人が使う
- 自分で作ったものを人が直す
その基準は?
一つの答: プログラムの意味を考える。
仕様、実装、実行
- 仕様 どういうプログラムが欲しいのか?
- 実装 どうプログラムを書くのか?
- 実行 そのプログラムはどう動くのか
それぞれに対応するプログラムの意味を考える。
- プログラムが満たしてほしい性質 ... 論理的意味、代数的意味
- プログラムを動かす仕組み ... 操作的意味
- プログラムの動いた履歴 ... 実行結果
プログラムを作る時の方法
仕様、実装、実行の相互の関連を通してプログラムが作られていく。
プログラムの意味を扱う道具
これらを取り扱うための数学的な道具がいろいろある。
そして、それらに対応したプログラミング言語とプログラミング手法が
考えられた。
- 集合 Specification Z
- 写像、関数 関数型プログラミング
- 論理 論理型プログラミング
これらを簡単に復習してみよう。
集合
対象とするものの集まりを集合という。集合には二通りの表し方がある。
- 集合の要素を全部示す
{伊是名 高志,大城 秀作,新里 博紀,山城 要, 深沢 弘保,平良 洋樹}
- 集合が満たす性質を示す
{X | X はデータベースの入力を手伝ってくれた人}
有限集合を考える限りはまったく簡単だ。が、無限集合は難しい。
集合に対して簡単な演算を考えることができる。
- 集合演算 ... /\ (AND), \/ (OR), ~ (NOT)
写像、関数
何かの入力に対して決まった値を返すものが関数である。
可能な入力の集合を定義域、定義域に対する出力の集合を値域という。
- 例g 学籍番号を入力として、 アカウントを出力する関数
- 例f アカウントを入力として、名前を出力する関数
- 例fg 学籍番号を入力として、名前を出力する関数
二つの関数を持って来て、片方の値域と他方の定義域が適合していれば、
関数の合成を作ることができる。
関数を集合と集合の対応と考える時には特に写像という言葉を用いることが
多い。(その方がCの関数と混同しなくてすむし...)
入力と出力の組み合わせの集合として関数を定義することもできる。
fg を以下の集合によって定義する。
{ (945707B,伊是 名高志),
(945709H,大城 秀作 ),
(945722E,新里 博紀),
(935446J,山城 要),
(945750A,深沢 弘保),
(945724B,平良 洋樹) }
論理
論理は以下の要素から構成される
- 命題 (Q,P,R) ... T / F, 正しい / 間違っている, 真 / 偽
- 変数 (x,y,z) ... いろいろな値が割り当てられる名前
- 述語 p,q(x) ... 変数を含む命題
- 論理演算 ... /\ (AND), \/ (OR), ~ (NOT)
空集合をF、空でない集合をT、と見ることによって、集合演算と論理演算は
同じものとみなすことができる。
集合を定義するのには、論理式を使うことが多い。
具体的なプログラムに関して集合を使って意味を考える
もし入力が有限で、出力が一つだけなら、とても簡単になる。
入力が無限だったりすると難しい。特にReal-timeプログラミング、並列
プログラミングの意味は難しい。
- 仕様は論理式で表すのが容易である
- 実装は関数で表すのが容易である
- 実行結果は集合で表すのが容易である
しかし、この三つの道具は、実際には同等な力を持った道具であり、
望むならば、論理だけ、関数だけ、集合だけ、ですべてを表現することも
できる。しかし、適材適所を考えて使おう。
プログラムの分割
これらのプログラムの意味を表す方法は、平らな方法であり、階層化
さていたり、分割されていたりはしない。
しかし、実際には、プログラムを分割しなくては、大きなプログラムは
作れないし、複数の人にプログラミングの仕事を分けることもできない。
しかし、分割する時は、全体のプログラムの意味が乱されないように分割
しなくてはならない。
これからの授業では、この分割の仕方を考えていくことになる。
Prev
Next
Kono's home page