手続き型プログラミング
手続き型プログラミング(てつづきがたプログラミング、英: Procedural programming)は、「手続き呼び出し」の概念に基づくプログラミングパラダイムの一種。命令型プログラミングと同義に扱われることが多い。「手続き」はプロシージャ、ルーチン、サブルーチン、メソッド、関数(数学の関数とは異なる。)など様々な呼称があるが、実行すべき一連の計算ステップを持つものと定義できる。手続きはプログラム実行中の任意の時点で呼び出すことができ、他の手続きからの呼び出しも、自分自身からの呼び出し(再帰呼び出し)も含まれる。
手続き型プログラミングは単純な逐次型プログラミングや非構造化プログラミングよりも多くの場合よりよい選択である。非構造化プログラミングでは複雑なコードを組むことは困難であり、保守性が悪い。手続き型プログラミングには、以下のような利点がある:
- コードを同じプログラム内でコピーすることなく再利用可能
- GOTO文やJUMP命令だけでプログラムの制御構造を構築するよりも容易(そのような制御構造だけで作られた巨大なプログラムをスパゲティプログラムと呼ぶ)
- モジュール性の高い構造化プログラミングが可能
目次 |
手続きとモジュール性 [編集]
大きく複雑なプログラムでは特にモジュール性が重要である。手続き型プログラミングでは、モジュールへの入力は構文的には「引数」であり、出力は「リターン値」である。
変数スコープは手続きのモジュール性を高めるもう1つの技法である。手続き内の変数は他の手続きからアクセスできない(逆も成り立つ)し、同じ手続きの複数の呼び出しの間でもそれが保たれる。スコープを超えたアクセスには特別な許可が必要である。
モジュール性の低い手続きも簡単なプログラムではよく使われる。その場合、実行環境内の多数の変数にアクセスし、他の手続きでも同様にそれらの変数にアクセスする。
単純で自己完結的で再利用可能なインタフェースであるため、手続きを使って多数の人間が書いたコードを組み合わせることが可能となり、ライブラリなども作成できるようになった。
命令型プログラミングとの比較 [編集]
ほとんどの手続き型プログラミング言語は命令型プログラミング言語でもある。実行環境の状態を明示的に参照する。この場合の状態とは(レジスタに対応する)「変数」であったり、LOGO言語での「タートル」の位置であったりする。
オブジェクト指向プログラミングとの比較 [編集]
手続き型プログラミングでは、プログラミングはデータ構造とルーチンの集合に分割される。一方オブジェクト指向プログラミングでは、プログラミングはオブジェクトに分割される。
一般にオブジェクト指向プログラミングの方が理解しやすいと言われている。その理由として、オブジェクト指向が人間の精神モデルの認知手法に近いからだという説もあるが、心理学が人間の認知モデルを完全には明確化できていない現時点では非常に不確かである。蒸気機関が発明されたとき、人間の精神は蒸気機関と比較された。コンピュータが発明されたとき、人間の精神はそれと比較された。オブジェクト指向プログラミングが発明されると、人間の精神はそれと比較されることになったのである。
多くの場合、オブジェクト指向の方がプログラムが小さくなり、保守が容易であると考えられている。プログラムはクラス群の定義から構成されている。オブジェクト指向言語と一口に言っても、全てをオブジェクトとみなす純粋なオブジェクト指向言語は少ない。例として最初のオブジェクト指向言語 Smalltalk があるが、商業的に成功したとは言いがたい。多くのオブジェクト指向言語は、手続き型プログラミングとオブジェクト指向を融合させたものである。
オブジェクト指向と手続き型の重要な違いとして、オブジェクト指向ではリレーショナルデータベースにアクセスするにあたって、データモデルのクラス構造へのマッピングが必要である。
以下にオブジェクト指向と手続き型の言語要素を比較した表を示す:
| 純粋なオブジェクト指向 | 純粋な手続き型 |
|---|---|
| メソッド | 関数(サブルーチン) |
| オブジェクト | モジュール |
| メッセージ | 呼び出し |
| メンバ | 変数 |
手続き型プログラミング言語 [編集]
手続き型と見なされるプログラミング言語は、手続き(プロシージャ)の概念を明確に持っていて、構文として定義している。
典型例はALGOLである。手続きがメソッドの形でしか出現しない言語は、手続き型というよりもオブジェクト指向と見なすのが一般的であり、以下のリストにはそのような言語は登場しない。例えば、C#やJavaがそうだが、C++はメソッド以外の形態で手続きを記述可能なので、以下に挙げてある。
- Ada
- ALGOL
- BASIC
- C言語
- C++
- ColdFusion
- COBOL
- D言語
- Delphi言語
- ECMAScript (ActionScript、DMDScript、JavaScript、JScript)
- Forth
- FORTRAN
- Maple
- Mathematica
- MATLAB
- Modula-2
- Oberon (Oberon-1、Oberon-2)
- Occam
- M言語
- Pascal
- Perl
- PHP
- Pike
- Python
- PL/I
- VBScript
- Visual Basic