手続き型プログラミング

手続きの定義と呼び出しによるプログラムの構造化を重視しているパラダイム
手続き型言語から転送)

手続き型プログラミング: Procedural programming)は、手続きの定義と呼び出しによるプログラムの構造化を重視しているパラダイム名義であり、同時にそれとプログラムの基本文にステートメントを採用している初期の高水準言語を指している用語でもある。命令型プログラミングと同義で扱われる事も多く、モジュール方式オブジェクト指向が導入されていないFORTRANCOBOLALGOLBASICPascalC言語といった言語がこのパラダイムの代表格として挙げられる。近年においてはオブジェクト指向を採用していない命令型言語を指して手続き型プログラミングとするのが最も一般的な用法である。

手続きprocedure)は言語によってサブルーチン関数、サブプログラムとも呼ばれており、一定の命令コードのまとまりを任意の手続き名に結び付けたコードユニットである。手続きは入力されたパラメータ引数によってそのプロセスを多分岐化し、その処理結果になるリターン値を出力する事ができる。入出力値無しの手続きも定義できる。手続きは一般的に非決定性チューリングマシンの性質に沿っているので、入力値による処理内容とそこからの出力値は、その手続きスコープ外の外部環境状態によっても変化する。この入力から出力への遷移の外的要因による可変性を指して手続き的(procedural)とも言われる。

概要編集

手続き型プログラミングでは基本的に、起点になるメインルーチンをルートにして階層的に分割された無数の手続きと、全ての手続きからアクセス可能なグローバル変数集合といったプログラム構成になる。複数の手続きからアクセスされるあらゆるデータを、グローバルにまとめてしまう簡素な設計は、プログラム全体への理解をむしろ促進するものとして小中規模のソフトウェア開発には適したものとされている。

手続きとモジュール性編集

大きく複雑なプログラムでは特にモジュール性が重要である。手続き型プログラミングでは、モジュールへの入力は構文的には「引数」であり、出力は「リターン値」である。

変数スコープは手続きのモジュール性を高めるもう1つの技法である。手続き内の変数は他の手続きからアクセスできない(逆も成り立つ)し、同じ手続きの複数の呼び出しの間でもそれが保たれる。スコープを超えたアクセスには特別な許可が必要である。

モジュール性の低い手続きも簡単なプログラムではよく使われる。その場合、実行環境内の多数の変数にアクセスし、他の手続きでも同様にそれらの変数にアクセスする。

単純で自己完結的で再利用可能なインタフェースであるため、手続きを使って多数の人間が書いたコードを組み合わせることが可能となり、ライブラリなども作成できるようになった。

他のプログラミングパラダイムとの対比編集

オブジェクト指向プログラミング編集

手続き型プログラミングでは、プログラミングはデータ構造とルーチンの集合に分割される。一方オブジェクト指向プログラミングでは、プログラミングはオブジェクトに分割される。

一般にオブジェクト指向プログラミングの方が理解しやすいと言われている。その理由として、オブジェクト指向が人間の精神モデルの認知手法に近いからだという説もあるが、心理学が人間の認知モデルを完全には明確化できていない現時点では非常に不確かである。蒸気機関が発明されたとき、人間の精神は蒸気機関と比較された。コンピュータが発明されたとき、人間の精神はそれと比較された。オブジェクト指向プログラミングが発明されると、人間の精神はそれと比較されることになったのである。

多くの場合、オブジェクト指向の方がプログラムが小さくなり、保守が容易であると考えられている。プログラムはクラス群の定義から構成されている。オブジェクト指向言語と一口に言っても、全てをオブジェクトとみなす純粋なオブジェクト指向言語は少ない。例として最初のオブジェクト指向言語 Smalltalk があるが、商業的に成功したとは言いがたい。多くのオブジェクト指向言語は、手続き型プログラミングとオブジェクト指向を融合させたものである。

オブジェクト指向と手続き型の重要な違いとして、オブジェクト指向では関係データベースにアクセスするにあたって、データモデルのクラス構造へのマッピングが必要である。

以下にオブジェクト指向と手続き型の言語要素を比較した表を示す。

純粋なオブジェクト指向 純粋な手続き型
メソッド 手続き(プロシージャ)
オブジェクト 構造体(レコード)
クラス モジュール
メッセージ 手続き呼び出し

関数型プログラミング編集

論理型プログラミング編集

代表的な手続き型言語編集

手続き型と見なされるプログラミング言語は、手続き(プロシージャ)の概念を明確に持っていて、構文として定義している。

典型例はALGOLである。手続きがメソッドの形でしか出現しない言語は、手続き型というよりもオブジェクト指向と見なすのが一般的であり、以下のリストにはそのような言語は登場しない。例えば、C#Javaがそうだが、C++はメソッド以外の形態で手続きを記述可能なので、以下に挙げてある。

関連項目編集

外部リンク編集