「構造化プログラミング」の版間の差分

削除された内容 追加された内容
Monadaisuki (会話 | 投稿記録)
→‎歴史: 「木村泉の見解」が分かり難いので、追記。
以前の自作文にサブルーチンを構造化に含めるなど複数の誤りがあったので修正しました。あと文章も少し修正しました。駄目なら戻すか再修正してください。
(2人の利用者による、間の4版が非表示)
1行目:
{{Otheruses|ダイクストラらによるソフトウェア工学的手法としての「構造化プログラミング」| goto文論争 |goto文}}
'''構造化プログラミング'''(こうぞうかプログラミング、{{lang-en-short|structured programming}})は、以下の2つの解釈がある。
 
'''構造化プログラミング'''(こうぞうかプログラミング|{{lang-en-short|''structured programming''}})は、プログラム記述をより簡素明快にしてソフトウェアの品質を高め、開発期間の短縮に伴う作業コストの軽減を目的に考案されたコンピュータ・プログラミング技術である。
# 1969年に[[エドガー・ダイクストラ]]らによって提唱されたプログラミング手法<ref name="structured_programming" />。良く構造化されたプログラム(well-structured programs)、段階的抽象化(step-wise abstraction)、[[段階的詳細化法|段階的詳細化]](step-wise refinement)、抽象データとその上で動作する抽象化文の共同詳細化(joint refinement)、プログラムの階層化などを特徴とする。
# [[構造化定理]]を使ってプログラミングすること。
 
今日の「構造化プログラミング」は複数の誤解を招く言葉となっており、本来の定義とソフトウェア技術者を含む世間の用法の間に差異が生じている。この様な事情から構造化プログラミングには以下の3つの解釈が存在している。
現在、構造化プログラミングと言えば、誤解ではあるが、多くの人に2だと思われている。
 
# 1969年に計算機科学者の[[エドガー・ダイクストラ|ダイクストラ]]らによって提唱され反響を呼んだソフトウェア工学理論<ref name="structured_programming" />。ここで構造化プログラミング(''structured programming)の名称が初めて使われ、広く知られるようになった。''
しかし、最初に構造化プログラミング(Structured programming)という言葉を使ったのは、[[エドガー・ダイクストラ]]であり、1が本来の構造化プログラミングである。
#1966年に計算機科学者の[[コラド・ベーム|ベーム]]らが発表した[[構造化定理|構造化プログラム原則(''structured program theorem)'']]によるプログラミング理論。
#1958年に公開された「[[ALGOL|ALGOL 58]]」を先駆けとする構造化プログラミング言語を用いた開発環境。名称が確立される以前からソフトウェア技術者の間では漠然と実践されていた。
 
今日の構造化プログラミングに対する一般的な認識は、(2)と(3)が示す「順次、選択、反復といった制御フローをブロック単位で表現し、それらを直列または入れ子状に配置する事でプログラムの構造化を実現する」という事になっているが、(1)の[[エドガー・ダイクストラ|ダイクストラ]]が提唱した理論が本来の意味での構造化プログラミングであり、本稿では(1)について説明する。(2)と(3)については「'''[[構造化定理]]'''」が該当記事となる。
この項目では、1について説明する。2については[[構造化定理]]を参照すること。
 
== 概要 ==
ダイクストラは1969年のワーキングペーパー<ref name="structured_programming" />で構造化プログラミングについて以下のように語っている。
 
# '''良く構造化されたプログラム(well-structured programs):programs)''':プログラムのサイズが大きくなっても正しさを証明できる構造にすること。[[構造化定理]]とは無関係。
# '''段階的抽象化(step-wise abstraction):abstraction)''':プログラムの意味のある部分をくくり出して抽象化文にすること。抽象化文は現在で言えば、関数やメソッドに相当する。これによって、プログラムの可読性が向上する。ダイクストラは段階的抽象化をするプログラムは[[構造化定理]]と同様の制御構造を使うべきと述べているが、このワーキングペーパーでそのような制御構造に触れているのはここだけであり、構造化プログラミングが構造化定理とあまり関係ないことがわかる。
# '''[[段階的詳細化法|段階的詳細化]](step-wise refinement):1969refinement)''':1969年のワーキングペーパーにこの言葉は登場しないが、段階的抽象化の説明の最後に「抽象的プログラムから始めるのもこの手法の1つの側面」と書いており、段階的詳細化のことに他ならない。段階的抽象化とは逆に抽象的な設計から始めて詳細化していくことによって設計を容易にする。
# '''抽象データとその上で動作する抽象化文の共同詳細化(joint refinement):refinement)''':現在の[[オブジェクト指向]]のクラスに近い考えである。抽象データ=メンバ変数、抽象化文=メソッドと言うことである。抽象データとその上で動作する抽象文を組み合わせて詳細にしていくのである。
# '''プログラムの階層化''':ダイクストラは共同詳細化の結果(オブジェクト指向のクラスに似たもの)を真珠に例えて、プログラムの階層化を説明した。ダイクストラは、階層化されたプログラムを真珠のネックレスに例えた。真珠のネックレスは真珠を交換して、変更を容易にしたり、真珠の再利用も可能である。
 
以上のように[[構造化定理]]とはあまり関係のないことであるが、現在でも構造化プログラミングと構造化定理は混同されている。