手続き型プログラミングは、命令型プログラミングに分類されるプログラミングパラダイムであり、[ 1 ]コンピュータプログラムの動作を、互いに呼び出し合う手続き(関数、サブルーチンとも呼ばれる)として実装するものです。結果として得られるプログラムは、構成要素となる手続きへの呼び出しの階層を形成する一連のステップとなります。
最初の主要な手続き型プログラミング言語は、Fortran、ALGOL、COBOL、PL/I、BASICなどを含め、1957年から1964年頃に登場しました。[ 2 ] PascalとCは1970年から1972年頃に発表されました。
コンピュータプロセッサは、スタックレジスタと、プロシージャの呼び出しおよび戻り命令を通じて、手続き型プログラミングのためのハードウェアサポートを提供します。LispマシンやJavaプロセッサなど、他の種類のプログラミングのためのハードウェアサポートも可能ですが、商業的に成功した例はありません。
特定のソフトウェア開発手法は、品質向上と開発・保守コストの削減を目的として、手続き型プログラミングと併用されることが多い。
モジュール化とは、プログラムの手順を個別のモジュールに整理することであり、各モジュールにはそれぞれ明確で理解しやすい目的がある。
変数と手順の範囲を最小限に抑えることで、手順やモジュールの認知負荷を軽減し、ソフトウェアの品質を向上させることができる。
モジュール性やスコープが不十分なプログラムは、他のプロシージャも使用する多くの変数を消費するプロシージャを持つ傾向があります。その結果、コードは理解しにくく、保守も困難になります。
プロシージャは明確に定義されたインターフェースを指定でき、自己完結型であるため、コードの再利用、特にソフトウェアライブラリを介した再利用をサポートします。
手続き型プログラミングは、実行を直接的に指示するため、命令型プログラミングに分類される。
手続き型言語は命令型言語のサブクラスです。手続き型言語はブロックとスコープの概念を含みますが、命令型言語はそのような機能を必要としない、より一般的な概念を記述します。手続き型言語は一般的に、ブロックを定義する予約語(if、、、whileなど)を使用して制御フローforを実装しますが、非構造化命令型言語(アセンブリ言語など)は、この目的のためにgotoと分岐テーブルを使用します。
命令型プログラミングに分類されるオブジェクト指向プログラミング(OOP)は、プログラムの実装を、明確に定義されたインターフェースを介して動作(メソッド)とデータ(メンバ)を公開するオブジェクトに分割します。対照的に、手続き型プログラミングは、プログラムの実装を変数、データ構造、サブルーチンに分割します。重要な違いは、手続き型プログラミングではデータ構造を操作する手順が含まれるのに対し、OOPではその2つをまとめて扱う点です。オブジェクトとは、データ構造と、そのデータ構造に関連付けられた動作のことです。[ 3 ]
一部のオブジェクト指向プログラミング言語は、定義に基づいてオブジェクトを作成できるクラスの概念をサポートしています。
両者は意味的には似ているものの、名称は異なる。
関数型言語におけるモジュール性とコード再利用の原則は、どちらも構造化プログラミングに由来するため、手続き型言語における原則と根本的に同じである。例えば、
これらのスタイルの主な違いは、関数型プログラミング言語が手続き型プログラミングの命令的な要素を排除するか、少なくとも軽視している点です。したがって、関数型言語の機能セットは、プログラムを可能な限り純粋関数で記述することをサポートするように設計されています。
しかし、多くの関数型言語は実際には純粋な関数型言語ではなく、命令型/手続き型の構成要素を備えているため、プログラマは手続き型スタイル、あるいは両方のスタイルを組み合わせたスタイルでプログラムを記述することができます。関数型言語では、入出力コードが手続き型スタイルで記述されるのが一般的です。
構造化プログラミングの原則をあえて無視し、プログラミングの難しさ(ひいては挑戦性)を追求した、難解な関数型言語(Unlambdaなど)もいくつか存在する。これらの言語は、手続き型言語と関数型言語の共通点から外れた例外と言えるだろう。
論理プログラミングにおいて、プログラムは前提の集合であり、計算は候補定理を証明しようと試みることによって行われる。この観点から見ると、論理プログラムは宣言的であり、問題をどのように解決するかではなく、問題が何であるかに焦点を当てている。
しかし、SLD解決によって実装される逆推論手法は、 Prologなどの論理プログラミング言語で問題を解決するために使用され、プログラムを目標削減手続きとして扱います。したがって、次の形式の節は次のようになります。
手順として二重の解釈がある
そして論理的な帰結として:
熟練した論理プログラマーは、手続き的解釈を用いて効果的かつ効率的なプログラムを作成し、宣言的解釈を用いてプログラムの正しさを保証する。