手続き型プログラミング

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動

手続き型プログラミング: Procedural programming)は、手続きの定義と呼出しの機能によってプログラムに構造性とモジュール性を備えさせたプログラミングパラダイムであり、状態遷移を起こすコマンドを扱うステートメントを基本文にする命令型プログラミングを土台にしている。近年においては、オブジェクト指向から比較的距離を置いている命令型言語を指して手続き型プログラミングとするのが一般的な用法である。FORTRANCOBOLALGOLBASICPascalC言語Visual BasicGoなどが代表格である。

手続き(procedure)は言語によってサブルーチン関数、サブプログラムとも呼ばれており、任意の手続き名に一定の命令コード群を結び付けたプログラムユニットである。これは命令コード群の抽象化とも解釈されている。手続きはパラメータ引数の入力によってそのプロセスを多分岐化してその処理結果になるリターン値を出力する。入力と出力の無い手続きも定義できるので、これは宣言型言語関数と対比されることがある。

概要[編集]

手続き型プログラムは、開始点のメインルーチンから階層的に分割された数々のサブルーチン及びそのローカル変数と、全てのサブルーチンからアクセス可能な数々のグローバル変数で構成される。サブルーチンとは手続きである。複数以上の手続きからアクセスされるあらゆるデータを、グローバル変数としてまとめてしまう簡素な設計は、小中規模のソフトウェア開発には適したものとされている。

手続き型には二通りの意味があり、しばしば説明の混同を招いている。命令型プログラミングと同義の手続き型と、手続き(procedure)機能に準拠した手続き型である。元々の手続き型は状態(state)によって現行計算の結果が変化するプロセスを意味していた。命令型の方は現行計算枠外の状態(state)を変更するコマンドを用いるプロセスを意味している。双方はまとめられて命令型=手続き型になった。手続き型の説明にしばしば命令文を順次実行していく、記憶領域に値を代入して状態変遷していくなどがあるのはそのためである。高水準言語が普及すると、命令型プログラムに手続き(procedure)機能を加えてモジュール性と構造性を備えさせたものが手続き型と呼ばれるようになった。

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

モジュール性とは、関心の分離情報の隠蔽英語版からなるコンセプトである。初期の手続き型プログラミングでは、手続きとそのローカル変数がモジュール相当に扱われており、プログラムを手続きに分割することがそのままモジュール性を表わしていた。スコープという概念も成立し、ローカル変数の読み書き可能範囲をその手続きの定義内に制限したものは、ローカルスコープと呼ばれた。モジュール性は再利用性とも関連しており、よく使われる手続きを各個参照可能にまとめたプログラムファイルはライブラリと呼ばれる。ライブラリは手続き(広義のモジュール)の複合体であるが、機能的凝集から離れた論理的凝集になっていることがほとんどなので、単にプログラミングのための再利用性のみに特化している。

プログラムの規模拡大につれてモジュール性は、多くなった手続きグローバル変数をグループ化して保守管理を容易にするための手法の導入を意味するようになった。そのために実装された機能はネームスペースパッケージプログラムモジュールなどである。プログラムモジュールは、一定の手続きとデータ(グローバル変数)を任意にまとめたユニットである。モジュール内に置かれたデータは、そのモジュール内の手続き専用のモジュール変数になった。この制限はモジュールスコープと呼ばれた。

任意の手続きとデータをまとめての整理方法は、関心の分離に基づいたモジュール凝集度で分類されている。内部隠蔽と外部公開の使い分けによるモジュール間の連結方法は、情報の隠蔽英語版に基づいたモジュール結合度で分類されている。これらの概念を体系化したパラダイムとしては、1970年代に考案されたモジュラルプログラミング英語版構造化分析設計技法構造化開発)がある。モジュラルプログラミングは、モジュールを仕様定義部分とコード/データ実装部分に分離しての抽象化を主体にしている。前者の仕様定義部分はシグネチャやインターフェースとも呼ばれ、関数プロトタイプ構造体タグを列記したものである。構造化開発は、モジュールを手続き複合体とデータ構造に分離しての双方による連携を主体にしている。前者の手続き複合体(モジュール)の各手続きは、内部隠蔽と外部公開用途に分けられている。

他のパラダイムとの対比[編集]

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

従来の手続き型(モジュラル英語版構造化)が、機能(手続き/関数)を中心にしていたのに対して、1980年代に登場したオブジェクト指向は、データを中心にしたプログラミングとされている。オブジェクト指向は、モジュラル時代に提唱された定義パートと実装パートの分離によるモジュール抽象化を、抽象データ構造および階層的プログラム構造といった新たな視点から拡張解釈したパラダイムである。それらの機能表現はクラスに集約されており、そのインスタンス化であるオブジェクトメッセージ送受信による相互作用でプロセスを構築する。クラスのインスタンス化に、専用手続きを通してデータを扱うというデータ抽象とデータ隠蔽の融合概念であるカプセル化を加えることで、データ中心の理想的なモジュール性(関心の分離+情報隠蔽英語版)が実現されている。

オブジェクト指向のもう一つの大きな特徴は、継承による階層的な構造と、その階層上の部分的な動的ディスパッチ英語版である。この部分的な動的ディスパッチは、手続きオーバーライドによるポリモーフィズムと呼ばれて手続きの抽象化を実現している。その部分的オーバーライドを全体的にしたインターフェース実装も可能であり、これはモジュラル時代の抽象化に近くなる。継承によるクラス階層構造は、共通パートに特有パートを付け足しての手軽なオブジェクトの機能拡張と、クラス間の共通パートを括りだして特有パートから分離してのオブジェクトの分類体系化を実現しており、プログラムの再利用性と保守性を高めるとされている。

オブジェクト指向 手続き型
クラス モジュール/パッケージ
メソッド 手続き
フィールド/プロパティ/属性 変数
メッセージパッシング 遠隔手続き呼出し

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

1970年代から注目され始めた関数型プログラミングは、計算機科学のバックボーンである数学に立ち返った視点での関数と値を扱うパラダイムであるが、プログラミング言語理論英語版視点では手続き型プログラミングのスーパーセットである。関数型は手続き型のようにも書けるが、その逆はほとんど不可能である。手続き型と関数型の関係は、例えるならば数学と数学基礎論の関係に近い。手続き型で何気なく扱っていたサブルーチンやデータを、関数型では基礎的視点から解釈できる。例えばステートメントは、直積だったなど。関数型が重視されるようになった背景には、その処理内容および結果値の外部状態による可変性(プログラム副作用)を大幅に許容した手続きのブラックボックス化偏重への見直しがあった。手続き=関数のホワイトボックス化が主目的にされた関数型では、同じ引数には同じ処理内容および同じ結果値が返るようにする参照透過性が基本原則にされている。関数型プログラミングの特性としては、高階関数/第一級関数、名前渡し、遅延評価束縛変数/自由変数型推論代数的データ型全称量/存在量などがある。従来の手続き型にこれらの特性を加えたものが関数型になると考えてよい。

関数型 手続き型
ステートメント
関数 手続き
束縛変数と自由変数 変数
代数的データ型 構造体共用体

論理プログラミング[編集]

論理プログラミングの流れは、C言語にあるswitch-case文の実行の繰り返しに例えることができる。これはパターンマッチングを含めたユニフィケーションと呼ばれる。ユニフィケーションはキーワードの照合によるプロセスの選択であり、照合元と照合先の定数と変数の双方向的な束縛によって引数の付与と返り値の取得も兼ねている。論理プログラミングの実行とは、このユニフィケーションの再帰反復と同義である。論理プログラミングは、関数型プログラミングの原型(=宣言型)から派生したパラダイムであり、形式論理学に沿ったパターンマッチングを主体にして自動推論分野に特化させていた。関数型と論理型の比較は述語論理の用法などで意味はあるが、手続き型と論理型の比較は双方の立ち位置が全く異なることから特に意味はないものと言える。

論理型 手続き型
リテラル(原子論理式) ステートメント
ルール(確定節) 手続き
ファクト(事実) データ
ゴール(目標節) メインルーチン

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

現在ではほとんどの言語はマルチパラダイム化されているが、それまでの期間が比較的長かったか、手続き型が主体にされているものを挙げる。公開年は最初期ではなく普及バージョンの方に合わせている。

関連項目[編集]

外部リンク[編集]