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