1. 序章

プログラミングパラダイムは、問題の計算ソリューションを開発するために使用されるモデルです。 これらのパラダイムは、プログラムを開発するためのルールとロジックを確立します。 このようにして、プログラミング言語はこれらのルールとロジックを実装し、プログラマーに提供します。 現在、ほとんどの既存のプログラミング言語は、命令型パラダイム、宣言型パラダイム、またはその両方をサポートしています。

この記事では、命令型および宣言型のプログラミングパラダイムについて説明します。 まず、プログラミングパラダイムについて簡単に説明します。 次に、命令型パラダイムを調査します。 このコンテキストでは、手続き型プログラミングとオブジェクト指向プログラミングの派生パラダイムを分析します。 次に、宣言型パラダイムと、機能および論理プログラミングの派生パラダイムを調べます。 最後に、プログラミングパラダイムを確認し、体系的な要約に比較します。

2. プログラミングパラダイムの概要

コンピュータプログラミングの結果として、人間はいくつかのプロセスを実行する際のパフォーマンスを向上させることができます。 コンピュータをプログラムする方法はいろいろあります。 ただし、採用された方法に関係なく、プログラマーは特定の言語を介してコンピューターと通信する必要があります。

この言語は、バイナリシンボル(0および1)のみを考慮する機械語にすることができます。 しかし、バイナリ記号のみを使用してプログラムを作成することは、複雑で豊富な言語システムを採用している現代人にとっては非常に珍しく、困難です。 したがって、これらの困難を克服するために、特定のレキシコン、構文、およびセマンティクスを備えた多くのプログラミング言語が長年にわたって提案されました。

プログラミング言語は、その機能に応じてパラダイムに細分化されます。 これらの機能の例としては、コード構造(プログラマーがコードを作成する方法)や実行モデル(コンピューターがプログラムの実行を進める方法)があります。 現在、命令型と宣言型の2つの主要なプログラミングパラダイムが存在します。 これらのパラダイムは、さらに特定の特性を持つ他のパラダイムに細分化されます。

次のセクションでは、最も著名なプログラミングパラダイムの主な特徴を探り、それらがどのように機能するかを理解します。

3. 命令型パラダイム

命令型パラダイムは、最も古いコンピュータープログラミングパラダイムです。 このパラダイムは、コンピュータシステムの状態の変更を表す一連の命令の定義を中心的な特性として提示します。 したがって、命令型パラダイムに従ったプログラムは、いくつかのタスクを実行する方法を説明する「ガイド」として見ることができます。

命令型パラダイムには、いくつかの参照があります。 フォンノイマンのアーキテクチャこのアーキテクチャは、処理ユニット、制御ユニット、およびメモリの使用を考慮に入れています。 要約すると、処理ユニットは算術モジュールとプロセッサレジスタで構成され、制御ユニットには命令レジスタとプログラムカウンタがあります。 次に、メモリはデータと命令を保持します。

命令型プログラミング言語は、フォンノイマンのアーキテクチャのコンテキストで提示された戦略を模倣します。 たとえば、メモリにはプログラムのデータと命令が格納されます。 したがって、ステートメントは、データを変数に割り当てたり、算術演算を実行したりするなど、メモリ内のデータを操作するために使用されます。 プログラムの命令を実行する順序があります。 したがって、特別な変数である命令ポインタは、次に実行するプログラム命令を示します。 やっと 、条件付き、ループ、およびその他の制御コマンド( 後藤 、プログラムの実行順序を変更して、命令ポインタの値を変更できます。

命令型パラダイムには、手続き型とオブジェクト指向の2つの一般的な派生パラダイムがあります。 次のサブセクションでは、それらに関連するいくつかの概念を説明します。

3.1. 手続き型プログラミング

手続き型プログラミングのパラダイムは、プログラムを単純な一連の命令から、特定の命令、構造、および変数を持つサブルーチンのコレクションに細分化することに焦点を当てています。 手続き型プログラミングの前は、コードの特定の部分の繰り返しは、 後藤 ステートメント。 ただし、プログラムコードの追跡が非常に複雑になり、保守と更新が困難になりました。 したがって、手続き型プログラミングによって促進されるサブルーチンへのモノリシックコードの分割は、プログラムコードのモジュール性を大幅に改善しました。

プログラムのサブルーチンは、明確に定義された単一のタスクを実行するように調整されています。 ただし、サブルーチンを実装するには、プログラムを開発するための新しい命令が必要でした。

  • 宣言:サブルーチンの宣言は通常、その名前と必要なパラメーターを定義します。 ほとんどの言語では、サブルーチン定義(コード)は宣言の直後に表示されます
  • 電話:すでに宣言されているサブルーチンの実行をトリガーする命令。 したがって、サブルーチンの各パラメータに対応するデータは、呼び出し元の命令内で定義されます。 
  • 戻る:return命令は、サブルーチンの結果を示します。 ただし、一部のサブルーチンは戻り可能な結果を表示しないため、戻り命令を実行しません。 

次の画像は、2つの数値を合計または減算するための非手続き型および手続き型の同等のプログラムの例を示しています。

手続き型プログラミングをサポートするプログラミング言語の例は、Basic、C、Pascal、Pythonです。

3.2. オブジェクト指向プログラミング

手続き型プログラミングパラダイムの後、命令型パラダイムは、構造化プログラミングとモジュラープログラミングという2つの連続した進化を遂げました。 まず、構造化プログラミングでは、サブルーチンに単一の開始コマンドがあり、できれば単一の出口点があると定義されています。 そのため、モジュラープログラミングは、プログラムを特定のメンバー(名前、プロシージャ、変数、サブモジュール)を持つモジュールに分割しました。

The オブジェクト指向プログラミングパラダイム モジュラープログラミングの概念に触発されました。 ただし、オブジェクト指向のパラダイムは 現実の世界を表す、私たちの脳と同じようにそれをモデル化します。 したがって、このパラダイムは、モジュラープログラミングからの概念に新しい意味と特性を導き、それらを改造します。 これらの改造された概念の例は、クラス、属性、およびメソッドです。 

  • クラス:現実世界の物事の表現。 クラスには名前があり、通常はいくつかの属性とメソッドがあります。 さらに、同じコードコンテキストで一度だけインポートされるモジュールとは異なり、クラスをオブジェクトとして複数回インスタンス化できます。
  • 属性:クラスのコンテキストに格納されている情報。 したがって、属性はクラスオブジェクトの状態を表します。 属性は、モジュールの変数といくつかの類似点があります。 ただし、オブジェクトには特定の名前名があります。 したがって、同じクラスの2つのオブジェクトは、同じ属性に対して異なる値を持つことができます。 
  • メソッド:要約すると、メソッドはクラスに関連付けられたプロシージャです。 メソッドは、クラスオブジェクトのコンテキストで呼び出されます。 したがって、メソッドは、属性値の変更などの内部変更や、ネットワークを介した通信などの他の副作用を引き起こす可能性があります。

次の画像は、具体的な例で以前に提示された概念を強調しています。

さらに、オブジェクト指向プログラミングは、抽象化カプセル化継承ポリモーフィズムなどの命令型パラダイムの新しい概念を定義しました。

オブジェクト指向プログラミングをサポートするプログラミング言語の例は、C ++、PHP、 Java 、およびPythonです。

4. 宣言型パラダイム

宣言型パラダイムの主な機能は、コンピューターシステムが実行する必要のあるタスクの定義です。 命令型パラダイムとは異なり、宣言型パラダイムはタスクの処理方法を明確にしません。 それどころか、宣言型パラダイムに従うプログラムは、これらのタスクがどのように実行されるかに関係なく、コンピューターシステムが実行する必要のあるタスクを定義する命令を備えた「ガイド」として機能します。

何かを行う方法ではなく、何を行うかを記述するというこの特性により、宣言型パラダイムのプログラムコードは、当然、より高い抽象化レベルをもたらします。 これは、事前に定義されたコマンド構造を使用してタスクを定義した結果です。 このより高い抽象化レベルは、これらのコマンド構造の標準化された操作により、プログラムの保守性も向上させます。 したがって、さまざまなチームが、開発や保守など、ソフトウェアライフサイクルの異なる段階で作業する方が簡単です。

2つの一般的なパラダイムは、宣言型パラダイムから派生しています。機能とロジックです。 これらのパラダイムについては、次のサブセクションで学習します。

4.1. 関数型プログラミング

機能パラダイムは、プログラムが複数の機能の構成であると見なします。 このようなシナリオでは、任意のデータ型として関数を使用できます。 したがって、関数は識別子を持つことができ、他の関数の引数または結果として機能します。 さらに、機能にはさまざまなカテゴリがあり、それぞれが特定の特性を考慮しています。

  • 第一級関数:機能パラダイムの初等関数。 それらは変数に割り当てられ、他の関数に引数として渡され、他の関数の結果として返される可能性があります
  • 純粋関数:これらの機能は、透明性と副作用の欠如の特性に従います。 透明性とは、同じ入力が与えられた場合、関数が常に同じ結果を返すことを意味します。 副作用がないということは、関数がプログラムに状態の変化を引き起こさないことを意味します。たとえば、情報の印刷やネットワークを介したデータの送信などです。
  • 高階関数 :これらの関数は、引数として他の関数を受け取るか、結果として関数を返します(またはその両方)。 例は地図関数 、指定されたiterableの各要素に提供された関数を実行し、新しいiterableを返します。

次の画像は、説明されている機能の実際の例を示しています。

最後に、機能パラダイムの興味深い側面は、変数が評価されないことです。 このように、データは決して変更されるべきではありません(不変性プロパティ)。 したがって、たとえば、リストに新しい値を追加するには、古いリストを破棄し、同じ値に新しい値を加えた新しいリストを作成する必要があります。

関数型プログラミングをサポートするプログラミング言語の例は、Haskell、Scala、およびKotlinです。

4.2. 論理プログラミング

論理プログラミングパラダイムは、形式的な論理を使用して無数の問題を解決します。このパラダイムは、クエリに回答するためのいくつかの事実とルールを備えた知識ベースに依存しています。

  • ファクト:ファクトはオブジェクト間の特定の関係を表します。 具体的には、事実はオブジェクトに関するアサーションです
  • ルール:ファクト間の論理関係を記述する述語です。 実際には、ルールには頭と体があり、一般的に頭はアサーションであり、体は条件です
  • クエリ:クエリは、論理演算子でインターリーブされた1つ以上の論理式で構成されます。 さらに、適切な答えを得るには、プログラムの知識ベースに事実とルールを考慮したクエリを作成する必要があります

説明されているリソースを使用して、プログラムは推論システムを使用してクエリに応答します。 したがって、推論システムは各クエリの証明を検索します。 最後に、プログラムは控除可能なソリューションをクエリに返します。 それ以外の場合、解決策がない場合、プログラムはfalse値を返します。

次の画像は、以前に提示された概念を示しています。

論理プログラミングをサポートするプログラミング言語の例は、ASP、Datalog、およびPrologです。

5. 体系的な要約

命令型パラダイムと宣言型パラダイムには違いがあります。 例えれば、あなたの車が壊れたと考えてください。 したがって、ステップバイステップのチュートリアルに従って自分で修正するか(命令型の解決策)、整備士に問題の解決を依頼することができます(宣言型の解決策)。 問題のコンテキストに関する追加情報がなければ、どちらの選択肢が優れているかを判断することはできません。 プログラミングパラダイムについても同じことが起こります。

ただし、命令型と宣言型のパラダイムには、同等の機能、長所、および短所があります。 次の表は、それらのいくつかをまとめたものです。

6. 結論

この記事では、命令型および宣言型プログラミングのパラダイムについて学びました。 最初に、命令型パラダイムを研究し、その主な特性を定義し、手続き型およびオブジェクト指向プログラミングの派生パラダイムを調査しました。 したがって、同様に宣言型パラダイムを研究し、特に機能プログラミングと論理プログラミングの派生パラダイムを調査しました。 最後に、命令型パラダイムと宣言型パラダイムの両方を体系的な要約にまとめます。

より良いプログラムを開発するには、さまざまなプログラミングパラダイムの存在が不可欠であると結論付けることができます。 このようにして、プログラマーは解決すべき問題に最適な戦略とツールを選択できます。