手続き型プログラミング

手続きの定義と呼び出しによるプログラムの構造化を重視しているパラダイム

手続き型プログラミング(てつづきがたプログラミング、: Procedural programming)は、手続きの定義と呼出しの機能によって、プログラムに構造性とモジュール性を持たせたプログラミングパラダイムである。命令型プログラミングを土台にしている。近年では、オブジェクト指向から比較的距離を置いている命令型言語を指して、手続き型とすることが多い。FORTRANCOBOLALGOLBASICPascalC言語Visual BasicGoなどがある。

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

概要編集

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

手続き型(procedural)には二通りの意味があり、しばしば説明の混同を招いている。命令型プログラミングと同義に扱われている手続き型と、プロシージャ機能由来の手続き型である。

手続き的知識などを由来にした手続き型は、コマンドで変化される状態(state)と照らし合わせて解釈される計算を意味していた[要検証]。命令型は状態を変化させるコマンドを用いる計算を意味している。後に命令型と手続き型の意味は融合された[要検証]。手続き型の説明にしばしば命令文を順次実行していく、記憶領域に代入して状態遷移していくなどがあるのはそのためである。高水準言語が普及すると、命令型プログラムにプロシージャ機能を加えてモジュール性と構造性を備えさせたものが手続き型と呼ばれるようになった。

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

モジュール性とは、関心の分離情報の隠蔽英語版からなるコンセプトである。初期の手続き型プログラミングでは、手続き+ローカル変数がモジュール相当になり、プログラムを手続きに分割することがモジュール性を表わしていた。スコープという概念も成立し、ローカル変数の読み書き可能範囲をその手続き定義内に制限したものは、ローカルスコープと呼ばれた。

モジュール性は再利用性とも関連しており、よく使われる手続きを各個参照可能にまとめたプログラムファイルはライブラリと呼ばれる。ライブラリは手続きの複合体であるが、機能的凝集から離れた論理的凝集になっていることがほとんどなので、単にプログラミングのための再利用性のみに特化している。

プログラムの規模拡大につれてモジュール性は、多くなった手続きグローバル変数のグループ化を意味するようになった。名前空間パッケージモジュールなどが登場した。モジュールは、一定の手続きとデータ(グローバル変数)をまとめたユニットである。モジュール・データは、同モジュール・手続き専用のモジュール変数になった。この制限はモジュールスコープと呼ばれた。

手続きとデータをまとめての整理方法は、関心の分離に基づいたモジュール凝集度で分類されている。内部隠蔽と外部公開の使い分けによるモジュール間の連結方法は、情報の隠蔽に基づいたモジュール結合度で分類されている。これらを体系化したプログラミングパラダイムには、1970年代に考案されたモジュラープログラミング英語版構造化分析設計技法構造化プログラミング)がある。

モジュラープログラミングは、モジュールを仕様定義とコード/データ実装に分離しての抽象化を主体にしている。仕様定義は、関数プロトタイプ構造体タグを列記したものであり、シグネチャやスペシフィケーションやインターフェースなどと呼ばれる。構造化プログラミングは、モジュールを手続き複合体とデータ構造に分離しての双方の連携を主体にしている。手続き複合体(モジュール)の各手続きは、内部隠蔽と外部公開用途に分けられている。

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

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

手続き型(モジュラー英語版構造化)が機能中心なのに対して、80年代登場のオブジェクト指向はデータ中心とされている。モジュラープログラミングの定義と実装の分離によるモジュール抽象化に、オブジェクト指向は抽象データ構造や階層的プログラム構造といった新たな概念を加えている。その機能表現はクラスに集約されており、そのインスタンス化であるオブジェクトの相互作用でプロセスを構築する。クラスのインスタンス化に、データ抽象とデータ隠蔽のカプセル化を加えることで、データ中心のモジュール性が実現されている。

もう一つの大きな特徴は、継承によるクラス階層構造と、その階層上の内包的な動的ディスパッチ英語版である。動的ディスパッチは、手続きオーバーライドポリモーフィズムによって手続きの抽象化を実現している。継承によるクラスの機能拡張と分類体系化は、プログラムの再利用性と保守性を高める。

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

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

70年代から注目され始めた関数型プログラミングは、数学的な関数を扱う。手続き型と関数型の関係は、例えるならば数学と数学基礎論の関係に近い。手続き型で何気なく扱っていたサブルーチンやデータを、関数型では基礎的視点から解釈できる。関数型重視の背景には、副作用による手続きのブラックボックス化偏重への見直しがあった。関数型では副作用を排した参照透過な関数のホワイトボックス化が基本にされている。関数型の言語機能特性としては、高階関数/第一級関数、名前渡し、遅延評価型推論代数的データ型、型構築子、パターンマッチング第一級などが挙げられる。

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

論理プログラミング編集

数理論理学論理式のプログラム投影が論理プログラミングである。その膨大な知識体系から様々なパラダイムが存在する。ホーン節とSLD導出をベースにしたPrologが最も普及しており、論理プログラミングの代名詞にもなっているので本節もこれに倣う。

Prologのプロセスは、C言語switch-case文の反復に例えることができる。これはパターンマッチングを含めたユニフィケーションと呼ばれる。ユニフィケーションはキーワードの照合によるプロセスの選択であり、照合元と照合先の定数および変数の双方向的な束縛によって、引数の付与と返り値の取得も兼ねている。Prologプログラムの実行は、ユニフィケーションの反復と再帰になる。ノイマン型特化の手続き型と、数理論理学投影の論理型のプログラムはかなり異なるものと言える。

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

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

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

関連項目編集

外部リンク編集