「手続き型プログラミング」の版間の差分
削除された内容 追加された内容
Baudanbau20 (会話 | 投稿記録) m "Template:" を含むテンプレート呼び出し |
|||
(同じ利用者による、間の5版が非表示) | |||
1行目:
{{独自研究|date=2016年6月}}
{{出典の明記|date=2016年6月}}
[[ファイル:Процесс решения задачи проектирования.png|境界|右|フレームなし|
{{プログラミング・パラダイム}}
'''手続き型プログラミング'''(てつづきがたプログラミング、{{lang-en-short|''Procedural programming''}})は、手続き(''procedure'')の定義と呼び出しをプログラム
手続きは一般的に[[非決定性有限オートマトン]]に準拠しているので、入力値による処理内容とそこからの出力値は、その手続き枠外の外部環境状態によっても変化する。この遷移図の可変性を指して手続き的(''procedual'')とも言われる。1958年の[[FORTRAN|FORTRANⅡ]]、[[ALGOL]]、[[COBOL]]といった最も初期の[[高水準言語]]から導入されている。
== 特徴 ==
手続き型プログラミングでは基本的に、起点になるメインルーチンをルートにして階層的に分割された無数の手続きと、全ての手続きから
=== 手続きとは ===
[[手続き]](''procedure'')は、命令コード(''instruction code'')のまとまりをパラメータリスト付きの識別子に結び付けたコードユニットである。識別子は同時にリターン値の代入対象になる。命令コードの一行単位はステートメント(''statement'')と呼ばれる。プログラム起点のメインルーチンは手続きとは見なされない。
手続きの名称は 手続きの識別子は手続き名と呼ばれる。パラメータリストには任意の個数の引数が列挙される。引数無しのケースもある。手続き名+パラメータリストの次にコードブロックが置かれる。コードブロックには1行以上の命令コードが列記される。命令コードは引数の使用によってプロセスの多相性を実現できる。コードブロックは[[レキシカルスコープ]]の範囲になり、そのスコープ専用のローカル変数を定義できる。ローカル変数は静的変数と自動変数に分かれる。静的変数はプログラム実行中を通して代入値が保持される。自動変数は[[スタックフレーム]]を利用したもので、手続き内へのエントリと共に自動確保され、リターンと共に自動消去されるものである。命令コード行の終端に達するとリターンする。リターンとはその手続きの呼び出しポイントの次の命令行に移動することである。プロセスの結果を示すリターン値は手続きの識別子を媒体にして呼び出し元に渡される。リターン命令で途中位置からのリターンもできる。スタックフレームの利用により手続きは[[再帰呼び出し]]も可能である。
=== 手続き型プログラムの構
手続き型プログラムは、メインルーチンをルートにして階層的に分割された無数の手続きと、全ての手続きから
=== モジュール機能 ===
また、モジュール内の手続きと[[構造体]]の実装部分を隠蔽して、定義部分だけをグローバル公開することもできる。この機能は{{仮リンク|Abstraction (computer science)|en|Abstraction (computer science)|label=抽象化}}と呼ばれる。[[C言語]]で例えると定義部分とは[[ヘッダファイル]]、実装部分とは[[ソースコード]]である。手続きの定義部分とは「返り値型+手続き名+引数リスト」の[[関数プロトタイプ]]を指す。[[構造体]]の定義部分とはタグ名を指す。抽象化された構造体は、同モジュール内の手続きのための引数と返り値用途限定になり、フィールドにはアクセスできないものとなる。このモジュールでの抽象化機能は、定義部分に当てはめる実装部分のモジュールを[[コンパイラ|コンパイル]]時や[[リンケージエディタ|リンカ]]時に選択できるようにしている。
=== 構造化とは ===
手続き型プログラミングと[[構造化プログラミング]]は、同じテーマでよく用いられる言葉である。構造化プログラミングの定義はやや曖昧であるが、コード記述視点とプログラム設計視点の二つから解釈される。前者のコード記述視点では、順接・分岐・反復の三つの[[制御構造|制御構文]]を用いて[[goto文]]を極力用いないソースコード記述を重視したプログラミングスタイルになる。[[構造化定理]]がよく引き合いに出されて、それに[[サブルーチン]]による適切なプログラム分割が加えられることもある。
後者のプログラム設計視点では、プログラム全体の適切な[[モジュール]]分割を図り、各モジュールの[[凝集度]]およびモジュール間の[[結合度]]の適切な設定を重視したプログラミングパラダイムになる。プログラム全体をモジュールの組み合わせとそれらの連携で構築しようとする考え方である。このモジュールによるプログラムの構造化は、1970年前後から盛んに研究され始めて「structured design(SD)」「structured analysis(SA)」「[[ジャクソンの構造化プログラミング|Jackson structured programming]](JSP)」「[[構造化分析設計技法|structured analysis and design technique]](SADT)」「[[SSADM|structured systems analysis and design method]](SSADM)」「modern structured analysis」といった数々の[[ソフトウェア工学]]テクニックが発表されている。グレンフォード・マイヤーズ、[[エドワード・ヨードン]]、[[トム・デマルコ]]などが有名である。
=== 命令型プログラミング ===
手続き型プログラミングは[[命令型プログラミング]]の分類に属している。これが意味する主なプログラム上の枠組みは、(A)手続きはパラメータ無しでもよくリターン値がなくてもよい、(B)手続き内ではグローバル変数とローカル静的変数と
また、手続き型プログラミングと命令型プログラミングは、[[オートマトン|オートマタ理論]]の[[非決定性有限オートマトン]]見地からの同じ意味で用いられてもいる。手続き的(''procedual'')の用法としてはこちらの方が標準である。この「手続き的」の意味も上述の(A)(B)(C)と同じである。
== 歴史 ==
手続き(''procedure'')の考え方自体はコンピュータ黎明期の[[機械語]]コードの時代から存在している。手続きの実装方式は、アセンブラなどの[[低水準言語]]で用いられる[[ニーモニック・コード|ニーモニックコード]]のCALL命令とRET命令が原点である。PUSH命令による引数の[[スタック|スタックメモリ]]への積み込みと、スタックポインタレジスタの減算による自動変数領域の確保、ベースポインタレジスタによる引数と自動変数の参照といった[[スタックフレーム]]の機能もアセンブラ由来のものである。CALL命令のジャンプ先アドレスに付けられたラベルは手続き名と同義になった。その仕組みは1950年代半ばから登場した[[高水準言語]]にもそのまま受け継がれた。ラベルは形式化されたパラメータリスト付きのプロシージャネームになり、スタックフレーム処理も自動化され、命令コード行のかたまりはソースコード上で明確に区分けされたコードブロックとして形式化された。こうして手続き(プロシージャ)は低水準言語から高水準言語への移行期に言わばごく自然に誕生している。
なお、史上初の高水準言語として1954年に公開されたFORTRANは、CALL命令とRET命令を備えていなかったので手続きの形式も持っていなかった。初代FORTRANのプログラムはPROGRAMという定義文で括られた一つのメインルーチンで記述されていた。故にこれは非手続き型言語である。プログラム規模の急速な拡大ですぐにサブルーチン構造も必要になり、1958年に発表されたFORTRANⅡではCALL命令とRET命令が追加された。メインルーチンから分けられたサブルーチンは「
== 他のパラダイムとの対比 ==
=== オブジェクト指向プログラミング ===
[[オブジェクト指向プログラミング|オブジェクト指向]]の
{| class="wikitable"
|-
52 ⟶ 62行目:
=== 関数型プログラミング ===
手続き型ではデータへの作用(読込と書込)を[[ステートメント]]と呼ばれる命令コードの一行単位で順々に実行していく。それに対して[[関数型言語|関数型]]では各データを関数
{| class="wikitable"
|-
72 ⟶ 82行目:
=== 論理型プログラミング ===
[[論理型プログラミング|論理型]]は「AはZである」「AとBはZである」「AはBのZである」「AはBをZする」といった知識を定義
{| class="wikitable"
|-
78 ⟶ 88行目:
! 手続き型
|-
| 単位節
|
|-
| 確定節
| 手続き
|-
|目標節▼
|メインルーチン▼
|-▼
| 原子論理式
| ステートメント
|-
92 ⟶ 105行目:
|導出節
|リターン値
▲|-
▲|目標節
▲|メインルーチン
|}
== 代表的な手続き型言語 ==
*[[FORTRAN|'''FORTRANⅡ''']] - 1958年、初の手続き型言語。その構文は[[低水準言語]]の特徴を少し残していた。
108 ⟶ 118行目:
* '''[[Pascal]]''' - 1970年、構造化プログラミングの模範言語。教育向け。
*'''[[C言語]]''' - 1972年、最も広く受け入れられた手続き型言語。
* '''[[Modula-2]]''' - 1978年、[[モジュール]]を導入した最初期のモジュー
*'''[[Ada]]''' - 1983年、[[米国国防総省|米国防総省]]が開発した[[マルチパラダイムプログラミング言語|マルチパラダイム]]手続き型言語。モジュール、[[ジェネリックプログラミング|ジェネリクス]]、[[並行計算]]など。
*'''[[QuickBASIC]]''' - 1985年、構造化されたBASIC。[[MS-DOS]]用。
*'''[[Oberon]]''' - 1987年、マルチパラダイム。[[抽象メソッド|抽象手続き]]をまとめたレコード
*'''[[Perl]]''' - 1987年、[[Webアプリケーション|WEBアプリケーション]]開発向け。
*[[Microsoft Visual Basic|'''Visual Basic''']] - 1991年、[[Microsoft Windows|Windows]]アプリケーション開発用のビギナー向け言語。
|