プログラミングパラダイムは、コンピュータプログラムの実装を概念化し構造化する比較的高レベルの方法です。プログラミング言語は、 1つ以上のパラダイムをサポートするものとして分類できます。[1]
パラダイムは、プログラミングのさまざまな側面に沿って分離され、記述されます。パラダイムの中には、副作用を許可するかどうか、操作のシーケンスが実行モデルによって定義されているかどうかなど、実行モデルの影響に関するものがあります。また、状態と動作の両方を含むユニットにグループ化するなど、コードの編成方法に関するパラダイムもあります。さらに、構文と文法に関するパラダイムもあります。
一般的なプログラミングパラダイムには以下のものがある(階層関係で表示):[2] [3] [4]
- 命令型- コードは実行フローと状態の変化を直接制御し、プログラムの状態を変更する明示的なステートメント
- 宣言型- コードは、望ましい結果のプロパティを宣言しますが、それを計算する方法は宣言しません。詳細な状態の変化を指定せずに、計算が何を実行するかを説明します。命令型プログラミングと比較してください (関数型プログラミングと論理型プログラミングは、宣言型プログラミングの主要なサブグループです)。
- 並行プログラミング- 並行性のための言語構造を持ち、これにはマルチスレッド、分散コンピューティングのサポート、メッセージパッシング、共有リソース(共有メモリを含む)、またはフューチャーが含まれる場合があります。
- アクタープログラミング-環境に応じてローカルな決定を下すアクターによる同時計算(利己的または競争的な行動が可能)
- 制約プログラミング- 変数間の関係は制約(または制約ネットワーク)として表現され、許容される解決策を指示します(制約充足または単体アルゴリズムを使用)
- データフロープログラミング- データ値が変更された場合の数式の強制再計算(例:スプレッドシート)
- 分散プログラミング- コンピュータネットワークを介して通信する複数の自律コンピュータをサポートする
- ジェネリックプログラミング- 後で指定する型で記述されたアルゴリズムを使用し、パラメータとして提供される特定の型に応じて必要に応じてインスタンス化します。
- メタプログラミング– 他のプログラム(または自分自身)をデータとして書き込んだり操作したりするプログラム、または実行時に行われる作業の一部をコンパイル時に行うプログラムの作成
- テンプレートメタプログラミング– コンパイラがテンプレートを使用して一時的なソースコードを生成し、コンパイラによって残りのソースコードとマージされてコンパイルされるメタプログラミング手法。
- リフレクティブプログラミング– プログラムが自らを変更または拡張するメタプログラミング手法
- パイプラインプログラミング– 元々何も設計されていなかった言語に、関数呼び出しをネストするための構文を追加する単純な構文変更。
- ルールベースプログラミング- 知識ベースを構成し、エキスパートシステムや問題の推論と解決に使用できる経験則のネットワーク
- ビジュアルプログラミング- プログラム要素をテキストで指定するのではなく、グラフィカルに操作する(例:Simulink)。ダイアグラムプログラミングとも呼ばれる。
概要

プログラミング パラダイムは、既存のソフトウェア開発手法に関するコンピュータ サイエンスの 研究から生まれました。その結果、プログラミング手法とプログラムのコーディングに使用する言語を記述および比較できるようになりました。参考までに、他の研究では ソフトウェア エンジニアリングのプロセスを研究し、それらを記述および比較するためのさまざまな方法論を説明しています。
プログラミング言語は、パラダイムの観点から説明できます。一部の言語は 1 つのパラダイムのみをサポートします。たとえば、Smalltalk はオブジェクト指向をサポートし、Haskell は関数型をサポートします。ほとんどの言語は複数のパラダイムをサポートします。たとえば、C++、Object Pascal、またはPHPで記述されたプログラムは、純粋に手続き型、純粋にオブジェクト指向、または両方のパラダイムの側面を含むことができます。
複数のパラダイムをサポートする言語を使用する場合、開発者は使用するパラダイム要素を選択します。ただし、この選択にはパラダイム自体を考慮する必要はありません。開発者は、言語が提供する機能を、開発者が知っている範囲で使用します。結果として得られるコードをパラダイム別に分類することは、多くの場合、後から行う学術的な作業です。
命令型パラダイムに分類される言語には、2 つの主な特徴があります。操作が発生する順序を明示的に制御する構造で指定することと、副作用を許可することです。副作用では、ある時点で 1 つのコード単位内において状態を変更し、後で別の時点で別のコード単位内でその状態を読み取ることができます。コード単位間の通信は明示的ではありません。
対照的に、宣言型パラダイムの言語は、操作を実行する順序を規定しません。代わりに、システムで利用可能な操作の数と、各操作の実行が許可される条件を提供します。[7] 言語の実行モデルの実装は、どの操作が自由に実行できるかを追跡し、順序を独立して選択します。詳細については、 マルチパラダイムプログラミング言語の比較を参照してください。
オブジェクト指向プログラミングでは、コードはオブジェクトに編成され、そのオブジェクトにはオブジェクトのコードが所有し、(通常は) 制御する状態が含まれます。ほとんどのオブジェクト指向言語は命令型言語でもあります。
オブジェクト指向プログラミングでは、プログラムは相互作用するオブジェクトのセットとして扱われます。関数型プログラミングでは、プログラムは状態のない関数評価のシーケンスとして扱われます。多数のプロセッサを備えたコンピュータまたはシステムをプログラミングする場合、プロセス指向プログラミングでは、プログラムは論理的な共有データ構造で動作する並行プロセスのセットとして扱われます。
多くのプログラミングパラダイムは、それがサポートする手法と同じくらい、それが禁止する手法でもよく知られています。たとえば、純粋関数型プログラミングでは副作用が禁止され、構造化プログラミングではgoto構文が禁止されています。このため、新しいパラダイムは、古いパラダイムに慣れている人から、教条的または過度に堅苦しいと見なされることがよくあります。[8]しかし、特定の手法を避けることで、プログラムの動作を理解しやすくなり、プログラムの正しさに関する定理を証明しやすくなります。
プログラミング パラダイムは、 API のみを使用して 実行モデルを呼び出すことができるプログラミング モデルと比較することもできます。プログラミング モデルは、実行モデルの機能に基づいてパラダイムに分類することもできます。
並列コンピューティングでは、言語ではなくプログラミング モデルを使用するのが一般的です。その理由は、並列ハードウェアの詳細が、ハードウェアのプログラムに使用される抽象化に漏れてしまうためです。これにより、プログラマは、アルゴリズムのパターンを実行モデルのパターン (ハードウェアが抽象化に漏れたために挿入された) にマッピングする必要があります。結果として、どの並列プログラミング言語もすべての計算問題に適切にマッピングされるわけではありません。したがって、基本の順次言語を使用し、プログラミング モデルを介して並列実行モデルへの API 呼び出しを挿入する方が便利です。このような並列プログラミング モデルは、共有メモリ、メッセージ パッシングによる分散メモリ、コード内に表示される場所の概念など、ハードウェアを反映する抽象化に従って分類できます。これらは、並列言語とプログラミング モデルにのみ適用されるプログラミング パラダイムの一種と考えることができます。
批判
プログラミング言語の研究者の中には、プログラミング言語の分類としてのパラダイムの概念を批判する人もいます。例えば、Harper [9]やKrishnamurthi [10]などです。彼らは、多くのプログラミング言語は厳密に1つのパラダイムに分類することはできず、むしろ複数のパラダイムの特徴を含んでいると主張しています。 「マルチパラダイムプログラミング言語の比較」を 参照してください。
歴史
プログラミングに対するさまざまなアプローチは、時とともに発展してきました。各アプローチの分類は、そのアプローチが最初に開発されたときに説明されることもあれば、後から振り返って説明されることもよくあります。意識的にそのように特定された初期のアプローチは、1960 年代半ばから提唱されている構造化プログラミングです。プログラミング パラダイムの概念は、少なくとも 1978 年にロバート W. フロイドがチューリング賞の講演で「プログラミングのパラダイム」と題した際にさかのぼります。この講演では、トーマス クーンの著書「科学革命の構造」 (1962 年)で使用されたパラダイムの概念が引用されています。 [11]初期のプログラミング言語には明確に定義されたプログラミング パラダイムがなく、プログラムで goto 文が多用されることもありました。これを多用すると、理解と保守が困難なスパゲッティ コードになります。このため、goto 文の使用を禁止し、より構造化されたプログラミング構造のみの使用を許可する構造化プログラミング パラダイムが開発されました。[12]
言語とパラダイム
マシンコード
マシン コードは、コンピューター プログラミングの最低レベルで、コンピューターの可能な限り低い抽象レベルで動作を定義する機械命令です。最も規範的なコーディング方法であるため、命令型として分類されます。
第一世代のプログラミング言語と呼ばれることもあります。
組み立て
アセンブリ言語は、マシン命令とメモリ アドレスのニーモニックを導入しました。アセンブリは命令型に分類され、第 2 世代プログラミング言語と呼ばれることもあります。
1960 年代には、ライブラリの COPY や非常に高度な条件付きマクロ生成および前処理機能、サブルーチンへの CALL 、外部変数、共通セクション (グローバル) をサポートするアセンブリ言語が開発され、READ/WRITE/GET/PUT などの論理演算子を使用することで、コードの大幅な再利用とハードウェア仕様からの分離が可能になりました。アセンブリは、マシンの動作を最も制御できるため、 時間重視のシステムや組み込みシステムで使用されていましたが、現在でも使用されています。
手続き型言語
手続き型言語は、第三世代プログラミング言語とも呼ばれ、高水準言語として初めて説明されました。解決する問題に関連する語彙をサポートします。たとえば、
- 共通ビジネス指向言語 ( COBOL ) –ファイル、移動、コピーなどの用語を使用します。
- FORMula TRANslation ( FORTRAN ) -数学言語の用語を使用し、主に科学および工学の問題のために開発されました。
- ALGOrithmic Language ( ALGOL ) – FORTRAN と同様に、数学言語の用語を使用しながら、科学的および工学的問題を対象にアルゴリズムを定義するのに適した言語であることに重点を置いています。
- プログラミング言語 One ( PL/I ) –ポインターをサポートする商用と科学のハイブリッド汎用言語。
- 初心者向け汎用シンボリック命令コード ( BASIC ) - より多くの人がプログラムを作成できるように開発されました。
- C – 汎用プログラミング言語。1969年から 1973 年にかけてAT&T ベル研究所でDennis Ritchieによって最初に開発されました。
これらの言語は手続き型パラダイムに分類されます。コンピュータ プログラムが実行するステップごとのプロセスを直接制御します。したがって、このようなプログラムの有効性と効率性は、プログラマーのスキルに大きく依存します。
オブジェクト指向プログラミング
手続き型言語を改良する試みとして、Simula、Smalltalk、C++、Eiffel、Python、PHP、Java、C#などのオブジェクト指向プログラミング(OOP) 言語が作成されました。これらの言語では、データとデータを操作するメソッドは、オブジェクトと呼ばれる同じコード単位にあります。このカプセル化により、オブジェクトがデータにアクセスできる唯一の方法は、データを含むオブジェクトのメソッドを経由することであることが保証されます。したがって、オブジェクトの内部動作は、オブジェクトを使用するコードに影響を与えることなく変更できます。
アレクサンダー・ステパノフ、リチャード・ストールマン[13] 、その他のプログラマーによって、OOPパラダイムと手続き型パラダイムの有効性に関する論争が起こっています。すべてのオブジェクトが連想メソッドを持つ必要があるため、懐疑論者の中にはOOPがソフトウェアの肥大化につながると考える人もいます。このジレンマを解決する試みとして、ポリモーフィズムが生まれました。
ほとんどの OOP 言語は第 3 世代ですが、オブジェクト指向のアセンブラ言語を作成することは可能です。High Level Assembly (HLA) はその一例であり、その起源は古くても、高度なデータ型とオブジェクト指向のアセンブリ言語プログラミングを完全にサポートしています。したがって、異なるプログラミング パラダイムは、必ずしも1 つのレベルから次のレベルへの進歩を表すものではなく、むしろその支持者の動機付けのミームのように見ることができます。 [要出典]競合するパラダイムの有効性を正確に比較することは、類似のエンティティとプロセスに適用される新しい異なる用語と、言語間の多数の実装の違いのために、より困難になることがよくあります。
宣言型言語
宣言型プログラミングプログラムは、問題が何であるかを記述するものであり、その解決方法を記述するものではありません。プログラムは、従うべき手順としてではなく、期待される結果で見つけるべき一連のプロパティとして構造化されます。データベースまたは一連のルールが与えられると、コンピューターは、必要なすべてのプロパティに一致するソリューションを見つけようとします。宣言型言語の原型は、第 4 世代言語 SQL、および関数型言語と論理プログラミングのファミリーです。
関数型プログラミングは宣言型プログラミングのサブセットです。このパラダイムを使用して記述されたプログラムは、数学関数のように動作するように設計されたコードブロックである関数を使用します。関数型言語では、代入による変数の値の変更が推奨されず、代わりに再帰が多用されます。
論理プログラミングパラダイムでは、計算は知識体系に対する自動推論であるとみなされます。問題領域に関する事実は論理式として表現され、問題の答えが見つかるまで、または式のセットが矛盾していることが証明されるまで、推論規則を適用してプログラムが実行されます。
他のパラダイム
シンボリックプログラミングは、数式やプログラムコンポーネントをデータとして操作できるプログラムを記述するパラダイムです。[4]プログラムは効果的に自分自身を変更し、「学習」するように見えるため、人工知能、エキスパートシステム、自然言語処理、コンピュータゲーム などのアプリケーションに適しています。このパラダイムをサポートする言語には、 LispやPrologなどがあります。[14]
微分可能プログラミングは、通常は自動微分化によってプログラム全体を微分化できるようにプログラムを構造化します。[15] [16]
命令型プログラミングの一種である文芸プログラミングでは、ハイパーテキスト エッセイのように、プログラムを人間中心の Web として構造化します。つまり、ドキュメントはプログラムに不可欠であり、プログラムはコンパイラの利便性ではなく、散文的説明のロジックに従って構造化されます。
リフレクションなどのシンボリックな手法は、プログラムが自分自身を参照できるようにするもので、プログラミング パラダイムとして考えられます。ただし、これは主要なパラダイムと互換性があるため、それ自体は実際のパラダイムではありません。
参照
参考文献
- ^ 「マルチパラダイムプログラミング言語」。Mozilla Developer Network。Mozilla Foundation。2013年6月21日。2013年8月21日時点のオリジナルよりアーカイブ。
- ^ Nørmark, Kurt. 「4つの主要なプログラミングパラダイムの概要」オールボー大学、2011年5月9日。2012年9月22日閲覧。
- ^ Frans Coenen (1999-10-11). 「宣言型プログラミング言語の特徴」cgi.csc.liv.ac.uk。 2014-02-27 にオリジナルからアーカイブ。2014-02-20に取得。
- ^ ab Michael A. Covington (2010-08-23). 「CSCI/ARTI 4540/6540: シンボリックプログラミングとLISPに関する最初の講義」(PDF) 。ジョージア大学。2012-03-07にオリジナル(PDF)からアーカイブ。2013-11-20に取得。
- ^ Peter Van Roy (2009-05-12). 「プログラミングパラダイム: すべてのプログラマが知っておくべきこと」(PDF) . info.ucl.ac.be . 2014-01-27閲覧。
- ^ Peter Van-Roy、Seif Haridi (2004)。コンピュータプログラミングの概念、テクニック、モデル。MIT Press。ISBN 978-0-262-22069-9。
- ^ 「プログラミングパラダイム:プログラミングの原則とは?」IONOS Digitalguide。2020年4月20日。2022年6月29日時点のオリジナルよりアーカイブ。 2022年5月3日閲覧。
- ^ Frank Rubin (1987 年 3 月). 「'GOTO は有害とみなされる' は有害とみなされる」(PDF) . Communications of the ACM . 30 (3): 195–196. doi :10.1145/214748.315722. S2CID 6853038. 2009 年 3 月 20 日時点のオリジナル(PDF)からアーカイブ。
- ^ Harper, Robert (2017 年 5 月 1 日)。「プログラミングパラダイムとは何か?」FifteenEightyFour。ケンブリッジ大学出版局。
- ^ Krishnamurthi, Shriram (2008 年 11 月). 「ポストリンネ時代のプログラミング言語の指導」. ACM SIGPLAN Notices . 43 (11). ACM: 81–83. doi :10.1145/1480828.1480846. S2CID 35714982.。
- ^ Floyd, RW (1979). 「プログラミングのパラダイム」Communications of the ACM . 22 (8): 455–460. doi : 10.1145/359138.359140 .
- ^ Soroka, Barry I. (2006). Java 5: Objects First. Jones & Bartlett Learning. ISBN 9780763737207。
- ^ 「モード継承、クローン作成、フック、OOP (Google グループ ディスカッション)」。
- ^ 「ビジネス用語集: シンボリックプログラミングの定義」allbusiness.com 。 2014年7月30日閲覧。
- ^ Wang, Fei; Decker, James; Wu, Xilun; Essertel, Gregory; Rompf, Tiark (2018), Bengio, S.; Wallach, H.; Larochelle, H.; Grauman, K. (eds.)、「コールバックによるバックプロパゲーション: 効率的で表現力豊かな微分可能プログラミングの基礎」(PDF)、Advances in Neural Information Processing Systems 31、Curran Associates, Inc.、pp. 10201–10212 、 2019-02-13取得
- ^ Innes, Mike (2018). 「機械学習とプログラミング言語について」(PDF)。SysML Conference 2018。2018-09-20 のオリジナル(PDF)からアーカイブ。2019-02-13に取得。
外部リンク
- 主要なプログラミングパラダイムの分類
- プログラミングパラダイムはどのように進化し、採用されるのでしょうか?
