「手続き型プログラミング」の版間の差分
削除された内容 追加された内容
Superveryhothot (会話 | 投稿記録) |
編集の要約なし |
||
(同じ利用者による、間の1版が非表示) | |||
3行目:
[[ファイル:Процесс решения задачи проектирования.png|境界|右|フレームなし|265x265px]]
{{プログラミング・パラダイム}}
'''手続き型プログラミング'''(
手続きは言語によってサブルーチン、関数、サブプログラムとも呼ばれており、一定の命令コードのまとまりを任意の手続き名に結び付けたコードユニットである。手続きは入力されたパラメータ引数によってそのプロセスを多相化し、処理結果となるリターン値を出力する事ができる。入出力値無しの手続きも定義できる。手続きは一般的に[[非決定性有限オートマトン]]に準拠しているので、入力値による処理内容とそこからの出力値は、その手続き枠外の外部環境状態によっても変化する。この遷移図の可変性を指して手続き的(''procedual'')とも言われ
== 特徴 ==
28行目:
手続き型プログラミングと[[構造化プログラミング]]は、同じテーマでよく用いられる言葉である。構造化プログラミングの定義はやや曖昧であるが、コード記述視点とプログラム設計視点の二つから解釈される。前者のコード記述視点では、順接・分岐・反復の三つの[[制御構造|制御構文]]を用いて[[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)手続き内ではグローバル変数とローカル静的変数と外部環境データが自由に変更される、(C)手続きは
また、手続き型プログラミングと命令型プログラミングは、[[オートマトン|オートマタ理論]]の[[非決定性有限オートマトン]]見地からの同じ意味で用いられて
== 歴史 ==
手続き(''procedure'')の考え方自体はコンピュータ黎明期の[[機械語]]コードの時代から存在している。手続きの実装方式は、アセンブラなどの[[低水準言語]]で用いられる[[ニーモニック・コード|ニーモニックコード]]のCALL命令とRET命令が原点である。PUSH命令による引数の[[スタック|スタックメモリ]]への積み込みと、スタックポインタレジスタの減算による自動変数領域の確保、ベースポインタレジスタによる引数と自動変数の参照といった[[スタックフレーム]]の機能もアセンブラ由来のものである。CALL命令のジャンプ先アドレスに付けられたラベルは手続き名と同義になった。その仕組みは1950年代半ばから登場した[[高水準言語]]にもそのまま受け継がれた。ラベルは形式化されたパラメータリスト付きのプロシージャネームになり、スタックフレーム処理も自動化され、命令コード行の
なお、史上初の高水準言語として1954年に公開されたFORTRANは、CALL命令とRET命令を備えていなかったので手続きの形式も持っていなかった。初代FORTRANのプログラムはPROGRAMという定義文で括られた一つのメインルーチンで記述されていた。故にこれは非手続き型言語
== 他のパラダイムとの対比 ==
81行目:
|}
=== 論理
[[論理型プログラミング|論理型]]は「AはZである」「AとBはZである」「AはBのZである」「AはBをZする」といった知識を定義する[[論理式 (数学)|論理式]]風の[[ステートメント]]群を記述し、それに対して「AはZであるか?」「Aと?はZであるか」といった質問を表わす[[論理式 (数学)|論理式]]をメインルーチンにして解を導き出すといった形式でプログラムを構築する。命令コードをシーケンシャルに順接実行する手続き型に対して、論理型では[[パターンマッチング]]による選択別実行が中心になっている。論理式には[[原子論理式]]としての[[入出力]]命令や[[アプリケーションプログラミングインタフェース|API]]命令も含めることが出来るので、解を導き出すという流れの中で手続き型と同様の命令コードを実行できる。
{| class="wikitable"
|