「手続き型プログラミング」の版間の差分
削除された内容 追加された内容
複数の問題テンプレートへの置き換え |
独自研究が含まれている可能性がある編集を差し戻す(参考:Wikipedia:コメント依頼/つもりやもり) タグ: サイズの大幅な増減 |
||
1行目:
{{独自研究|date=2016年6月}}
{{出典の明記|
{{プログラミング言語|index=てつつきかたふろくらみんく}}
[[ファイル:Процесс решения задачи проектирования.png|境界|右|フレームなし|200x200ピクセル]]
'''手続き型プログラミング'''(てつづきがたプログラミング、{{lang-en-short|''Procedural programming''}})は、手続きの定義と呼び出しをプログラム全体を組み立てる土台にした[[プログラミングパラダイム]]である。[[プロシージャ|手続き]]は言語によって[[サブルーチン]]、[[関数 (プログラミング)|関数]]、[[メソッド (計算機科学)|メソッド]]とも呼ばれている。手続きはプログラム全体を区画した部分プログラムでもあり、一定量の計算ステップまたは命令コードのまとまりを、任意の定義名に結び付けて識別化したコードユニットである。手続き型プログラミングは[[命令型プログラミング]]の分類に属しており、1958年の[[FORTRAN|FORTRANⅡ]]、[[ALGOL]]、[[COBOL]]といった最も初期の[[高水準言語]]から導入されている。
手続き(''procedure'')は、プログラム内のあらゆるポイントから呼び出す(''call'')ことが可能であり、手続き内の命令コード行の終端に達した時は、その手続きを呼び出したポイントの次のアドレスに制御が移される。これは復帰(''return'')と呼ばれる。リターン命令で途中位置でも復帰できる。手続きは他の手続き内からの呼び出しの他、自身内からの呼び出しも可能でありこれは[[再帰]](''recursive call'')と呼ばれる。手続きの呼び出しと復帰は、コンピュータ側が提供する[[コールスタック]]または[[スタックフレーム]]機能の命令アドレス管理によって実現されている。
== 手続きの来歴 ==
手続き(''procedure'')の考え方は、[[機械語]]コードの時代から存在しており、[[低水準言語]]([[アセンブリ言語|アセンブラ]])にある[[ニーモニック・コード|ニーモニックコード]]のCALL命令とRET命令が原点である。PUSH命令による引数の[[スタック|スタックメモリ]]への積み込みと、スタックポインタレジスタの減算によるローカル変数領域の確保、ベースポインタレジスタによる引数とローカル変数へのアクセスといった[[スタックフレーム]]の機能もアセンブラ由来のものである。CALL命令のジャンプ先アドレスに付けられたラベルは手続き名と同義になった。その仕組みは1950年代半ばから登場した[[高水準言語]]にもそのまま受け継がれた。ラベルは形式化された引数欄付きの呼び出し名となり、スタックフレーム処理も自動化隠蔽され、ソースコード上で明確に区分けされた手続き(プロシージャ)として誕生した。
== 手続きとモジュール性 ==
大きく複雑なプログラムでは特に[[モジュール性]]が重要である。手続き型プログラミングでは、モジュールへの入力は構文的には「引数」であり、出力は「リターン値」である。
変数[[スコープ]]は手続きのモジュール性を高めるもう1つの技法である。手続き内の変数は他の手続きからアクセスできない(逆も成り立つ)し、同じ手続きの複数の呼び出しの間でもそれが保たれる。スコープを超えたアクセスには特別な許可が必要である。
モジュール性の低い手続きも簡単なプログラムではよく使われる。その場合、実行環境内の多数の変数にアクセスし、他の手続きでも同様にそれらの変数にアクセスする。
単純で自己完結的で再利用可能なインタフェースであるため、手続きを使って多数の人間が書いたコードを組み合わせることが可能となり、[[ライブラリ]]なども作成できるようになった。
===
=== オブジェクト指向プログラミング ===
手続き型プログラミングでは、プログラミングは[[データ構造]]とルーチンの集合に分割される。一方[[オブジェクト指向プログラミング]]では、プログラミングは[[オブジェクト (プログラミング)|オブジェクト]]に分割される。
一般にオブジェクト指向プログラミングの方が理解しやすいと言われている。その理由として、オブジェクト指向が人間の精神モデルの認知手法に近いからだという説もあるが、心理学が人間の認知モデルを完全には明確化できていない現時点では非常に不確かである。蒸気機関が発明されたとき、人間の精神は蒸気機関と比較された。[[コンピュータ]]が発明されたとき、人間の精神はそれと比較された。オブジェクト指向プログラミングが発明されると、人間の精神はそれと比較されることになったのである。
多くの場合、オブジェクト指向の方がプログラムが小さくなり、保守が容易であると考えられている。プログラムはクラス群の定義から構成されている。オブジェクト指向言語と一口に言っても、全てをオブジェクトとみなす純粋なオブジェクト指向言語は少ない。例として最初のオブジェクト指向言語 [[Smalltalk]] があるが、商業的に成功したとは言いがたい。多くのオブジェクト指向言語は、手続き型プログラミングとオブジェクト指向を融合させたものである。
オブジェクト指向と手続き型の重要な違いとして、オブジェクト指向では[[関係データベース]]にアクセスするにあたって、データモデルのクラス構造へのマッピングが必要である。
以下にオブジェクト指向と手続き型の言語要素を比較した表を示す。
{| class="wikitable"
|-
! 純粋なオブジェクト指向
! 純粋な手続き型
|-
| [[メソッド (計算機科学)|メソッド]]
| [[サブルーチン|手続き(プロシージャ)]]
|-
| [[オブジェクト (プログラミング)|オブジェクト]]
| [[構造体|構造体(レコード)]]
|-
| [[クラス (コンピュータ)|クラス]]
| [[モジュール]]
|-
| [[
| 手続き呼び出し
|}
=== 関数型プログラミング ===
=== 論理型プログラミング ===
== 代表的な手続き型言語 ==
手続き型と見なされるプログラミング言語は、手続き(プロシージャ)の概念を明確に持っていて、構文として定義している。
典型例は[[ALGOL]]である。手続きが[[メソッド (計算機科学)|メソッド]]の形でしか出現しない言語は、手続き型というよりもオブジェクト指向と見なすのが一般的であり、以下のリストにはそのような言語は登場しない。例えば、[[C Sharp|C#]]や[[Java]]がそうだが、[[C++]]はメソッド以外の形態で手続きを記述可能なので、以下に挙げてある。
* [[Ada]]
* [[ALGOL]]
* [[BASIC]]
* [[C言語]]
* [[C++]]
* [[ColdFusion]]
* [[COBOL]]
* [[D言語]]
* [[Object Pascal|Delphi言語]]
* [[ECMAScript]] ([[ActionScript]]、[[DMDScript]]、[[JavaScript]]、[[JScript]])
* [[Forth]]
* [[FORTRAN]]
* [[Maple]]
* [[Mathematica]]
* [[MATLAB]]
* [[Modula-2]]
* [[Oberon]] (Oberon-1、[[Oberon-2]])
* [[Occam]]
* [[MUMPS|M言語]]
* [[Pascal]]
* [[Perl]]
* [[PHP (プログラミング言語)|PHP]]
* [[Pike]]
* [[Python]]
* [[PL/I]]
* [[VBScript]]
* [[Microsoft Visual Basic|Visual Basic]]
== 関連項目 ==
*
* [[プログラミング言語]]
* [[命令型プログラミング]]
** [[オブジェクト指向プログラミング]]
** [[構造化プログラミング]]
** [[非手続き型言語|非手続き型プログラミング]]
* [[宣言型プログラミング]]
**[[関数型言語|関数型プログラミング]]
**[[論理型言語|論理型プログラミング]]
**[[問い合わせ言語]]
== 外部リンク ==
* [http://dmoz.org/Computers/Programming/Languages/Procedural/ Open Directory: Programming: Languages: Procedural]
[[Category:プログラミングパラダイム|てつつきかたふろくらみんく]]
|