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