プログラミングパラダイム

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

プログラミングパラダイムは、その機能に基づいてプログラミング言語を分類する方法です。言語は複数のパラダイムに分類できます。

一部のパラダイムは、主に、副作用の許可や、操作のシーケンスが実行モデルによって定義されているかどうかなど、言語の実行モデルへの影響に関係しています。他のパラダイムは、コードによって変更された状態とともにコードをユニットにグループ化するなど、主にコードの編成方法に関係しています。さらに、主に構文と文法のスタイルに関心を持つ人もいます。

一般的なプログラミングパラダイムは次のとおりです。[1] [2] [3]

  • プログラマーがマシンにその状態を変更する方法を指示する命令
  • プログラマーが目的の結果のプロパティを宣言するだけで、それを計算する方法は宣言しない宣言
    • 目的の結果が一連の関数アプリケーションの値として宣言される関数
    • 事実と規則のシステムに関する質問への答えとして、望ましい結果が宣言される論理、
    • 目的の結果が最適化問題の解として宣言される数学
    • 望ましい結果がデータストリームと変更の伝播で宣言されるリアクティブ

プログラムがそれ自体を参照できるようにするリフレクションなどのシンボリック手法も、プログラミングパラダイムと見なすことができます。ただし、これは主要なパラダイムと互換性があるため、それ自体が実際のパラダイムではありません。

たとえば、命令型パラダイムに該当する言語には、 2つの主要な機能があります。操作が発生する順序を明示的に制御する構造で記述し、副作用を許可します。この場合、状態はある時点で変更できます。 1つのコード単位内で、後で別のコード単位内の別の時点で読み取ります。コード単位間の通信は明示的ではありません。一方、オブジェクト指向プログラミングでは、コードは、オブジェクトの一部であるコードによってのみ変更される状態を含むオブジェクトに編成されます。ほとんどのオブジェクト指向言語も命令型言語です。対照的に、宣言型パラダイムに適合する言語操作を実行する順序を記述しないでください。代わりに、システムで使用可能な多数の操作と、それぞれの実行が許可される条件を提供します。言語の実行モデルの実装は、どの操作を自由に実行できるかを追跡し、順序を個別に選択します。マルチパラダイムプログラミング言語の比較の詳細

概要

Peter Van Royによるさまざまなプログラミングパラダイムの概要[4] :5  [5]

ソフトウェアエンジニアリング(プロセスとして)がさまざまな方法論によって定義されているように、プログラミング言語(計算モデルとして)もさまざまなパラダイムによって定義されています。一部の言語は1つのパラダイムをサポートするように設計されています(Smalltalkはオブジェクト指向プログラミングをサポートし、Haskellは機能プログラミングをサポートします)が、他のプログラミング言語は複数のパラダイムをサポートします(Object PascalC ++JavaJavaScriptC#ScalaVisual BasicCommon Lispなど) 、スキームPerlPHPPythonRubyOz、およびF#)。たとえば、C ++、Object Pascal、またはPHPで記述されたプログラムは、純粋に手続き型、純粋にオブジェクト指向、または両方または他のパラダイムの要素を含むことができます。ソフトウェアの設計者とプログラマーは、これらのパラダイム要素の使用方法を決定します。

オブジェクト指向プログラミングでは、プログラムは相互作用するオブジェクトのセットとして扱われます。関数型プログラミングでは、プログラムはステートレス関数評価のシーケンスとして扱われます。多くのプロセッサを搭載したコンピュータまたはシステムをプログラミングする場合、プロセス指向プログラミングでは、プログラムは論理共有データ構造に作用する並行プロセスのセットとして扱われます

多くのプログラミングパラダイムは、それらが可能にするものと同様に、それらが禁止する技術でよく知られています。たとえば、純粋関数型プログラミングでは副作用の使用が許可されていませんが、構造化プログラミングではgotoステートメントの使用が許可されていません。部分的にこの理由のために、新しいパラダイムは、以前のスタイルに慣れている人々によって、教義主義者または過度に厳格であると見なされることがよくあります。[6]それでも、特定の手法を回避すると、プログラムの動作を理解しやすくなり、プログラムの正当性 に関する定理を証明しやすくなります。

プログラミングパラダイムは、APIのみを使用して実行モデルを呼び出すことができるプログラミングモデルと比較することもできます。プログラミングモデルは、実行モデルの機能に基づいてパラダイムに分類することもできます。

並列計算では、言語の代わりにプログラミングモデルを使用するのが一般的です。その理由は、並列ハードウェアの詳細が、ハードウェアのプログラミングに使用される抽象化に漏れているためです。これにより、プログラマーはアルゴリズムのパターンを実行モデルのパターン(ハードウェアが抽象化に漏れたために挿入されたもの)にマップする必要があります。結果として、1つの並列プログラミング言語がすべての計算問題にうまく対応できるわけではありません。したがって、基本シーケンシャル言語を使用し、プログラミングモデルを介して並列実行モデルにAPI呼び出しを挿入する方が便利です。このような並列プログラミングモデルは、共有メモリ分散メモリなどのハードウェアを反映する抽象化に従って分類できます。メッセージパッシング、コードに表示される場所の概念など。これらは、並列言語とプログラミングモデルにのみ適用されるプログラミングパラダイムのフレーバーと見なすことができます。

批評

一部のプログラミング言語研究者は、パラダイムの概念をプログラミング言語の分類として批判しています。たとえば、Harper [7]やKrishnamurthiなどです。[8] 彼らは、多くのプログラミング言語を厳密に1つのパラダイムに分類することはできず、むしろいくつかのパラダイムの機能を含むと主張しています。マルチパラダイムプログラミング言語の比較を参照してください

歴史

プログラミングへのさまざまなアプローチが時間の経過とともに発展し、その時点で、または遡及的にそのように識別されています。そのように意識的に特定された初期のアプローチは、1960年代半ばから提唱された構造化プログラミングです。「プログラミングパラダイム」の概念は、少なくとも1978年にさかのぼり、ロバートW.フロイドのチューリング賞講演で「プログラミングのパラダイム」と題され、トーマスクーンが科学革命の構造で使用したパラダイムの概念を引用しています。革命(1962年)。[9]

機械語

最下位のプログラミングパラダイムは、命令(プログラムメモリの内容)を数字のシーケンスとして直接表すマシンコードと、マシン命令がニーモニックで表され、メモリアドレスに記号ラベルを付けることができるアセンブリ言語です。これらは、第1世代および第2世代の言語 と呼ばれることもあります。

1960年代に、ライブラリCOPYと非常に高度な条件付きマクロ生成および前処理機能、CALL to(サブルーチン)、外部変数、および共通セクション(グローバル)をサポートするアセンブリ言語が開発され、コードの大幅な再利用とハードウェア固有の分離を可能にしました。 READ / WRITE / GET / PUTなどの論理演算子の使用。アセンブリは、タイムクリティカルなシステムで使用され、現在も使用されています。これは、マシンの動作を最も直接制御できるため 、組み込みシステムで使用されることがよくあります。

手続き型言語

次の進歩は、手続き型言語の開発でした。これらの第3世代言語(最初は高級言語として説明されています)は、解決される問題に関連する語彙を使用します。例えば、

  • COmmon Business Oriented Language(COBOL )–ファイル移動コピーなどの用語を使用します
  • FORmula TRANslation(FORTRAN)–数学言語の用語を使用して、主に科学および工学の問題のために開発されました。
  • ALGOrithmic Language(ALGOL )–数学言語の用語を使用しながら、FORTRANのように科学的および工学的問題を対象として、アルゴリズムを定義するための適切な言語であることに焦点を当てています。
  • プログラミング言語1(PL / I )–ポインターをサポートする商用科学のハイブリッド汎用言語
  • 初心者万能シンボリックインストラクションコード(BASIC)–より多くの人がプログラムを書けるようにするために開発されました。
  • C  –汎用プログラミング言語。1969年から1973年にかけてAT&T BellLabsでDennisRitchieによって最初に開発されました。

これらの言語はすべて、手続き型パラダイムに従います。つまり、特定の問題を解決するために、少なくとも特定のプログラマーによれば、従う必要のある手順を段階的に正確に説明します。したがって、そのようなソリューションの有効性効率は、完全に主観的であり、そのプログラマーの経験、創意工夫、および能力に大きく依存します。

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

手続き型言語が広く使用された後、 SimulaSmalltalkC ++EiffelPythonPHPJavaC#などのオブジェクト指向プログラミング(OOP)言語が作成されました。これらの言語では、データとそれを操作するためのメソッドは、オブジェクトと呼ばれる1つの単位として保持されますOOPの際立った機能の1つである完全なカプセル化により、別のオブジェクトまたはユーザーがデータにアクセスできる唯一の方法は、オブジェクトのメソッドを使用することです。したがって、オブジェクトを使用するコードに影響を与えることなく、オブジェクトの内部動作を変更できます。OOPパラダイムと手続き型パラダイムの有効性に関して、Alexander StepanovRichard Stallman [10] 、および他のプログラマーによって提起されたいくつかの論争がまだあります。すべてのオブジェクトが連想メソッドを持つ必要があるため、一部の懐疑論者はOOPをソフトウェアの肥大化と関連付けることになります。このジレンマを解決する試みは、ポリモーフィズムによってもたらされました。

オブジェクト指向プログラミングは言語ではなくパラダイムと見なされているため、オブジェクト指向アセンブラー言語でさえ作成することができます。High Level Assembly(HLA)は、その初期の起源にもかかわらず、高度なデータ型とオブジェクト指向アセンブリ言語プログラミングを完全にサポートするこの例です。したがって、異なるプログラミングパラダイムは、必ずしもあるレベルから次のレベルへの進歩を表すのではなく、支持者の動機付けのミームのように見ることができます[要出典]競合するパラダイムの有効性の正確な比較は、類似のエンティティやプロセスに適用される新しい異なる用語と、言語間の多数の実装の違いにより、しばしば困難になります。

さらなるパラダイム

文芸的プログラミングは、命令型プログラミングの形式として、ハイパーテキストエッセイのように、人間中心のWebとしてプログラムを構造化します。ドキュメントはプログラムに不可欠であり、プログラムはコンパイラの利便性ではなく、散文の説明のロジックに従って構造化されます。

命令型ブランチとは独立して、宣言型プログラミングパラダイムが開発されました。これらの言語では、問題の解決方法ではなく、問題が何であるかがコンピューターに通知されます。プログラムは、従う手順としてではなく、期待される結果を見つけるための一連のプロパティとして構成されています。データベースまたは一連のルールが与えられると、コンピューターは必要なすべてのプロパティに一致するソリューションを見つけようとします。宣言型言語の原型は、第4世代言語 SQLであり、関数型言語と論理プログラミングのファミリーです。

関数型プログラミングは、宣言型プログラミングのサブセットです。このパラダイムを使用して作成されたプログラムは、関数、数学関数のように動作することを目的としたコードのブロックを使用します関数型言語は、割り当てによる変数の値の変更を思いとどまらせ、代わり に再帰を多用します。

論理プログラミングパラダイムは、計算を知識体系に対する自動推論と見なします。問題領域に関する事実は論理式として表現され、プログラムは、問題に対する答えが見つかるか、式のセットに一貫性がないことが証明されるまで、それらに 推論規則を適用することによって実行されます。

シンボリックプログラミングは、数式やプログラムコンポーネントをデータとして操作できるプログラムを説明するパラダイムです。[3]したがって、プログラムは効果的に自分自身を変更し、「学習」しているように見えるため、人工知能エキスパートシステム自然言語処理、コンピューターゲーム などのアプリケーションに適しています。このパラダイムをサポートする言語には、LispPrologが含まれます。[11]

微分可能プログラミングは、通常は自動微分を介して全体を微分できるようにプログラムを構成します[12] [13]

複数のパラダイムのサポート

ほとんどのプログラミング言語は複数のプログラミングパラダイムをサポートしており、プログラマーは特定のジョブに最適なプログラミングスタイルと関連する言語構造を使用できます。[14]

も参照してください

参考文献

  1. ^ Nørmark、カート。4つの主要なプログラミングパラダイムの概要オールボー大学、2011年5月9日。2012年9月22日取得。
  2. ^ Frans Coenen(1999-10-11)。「宣言型プログラミング言語の特徴」cgi.csc.liv.ac.uk。_ 2014年2月20日取得
  3. ^ a b マイケル・A・コヴィントン(2010-08-23)。「CSCI / ARTI4540 / 6540:シンボリックプログラミングとLISPに関する最初の講義」(PDF)ジョージア大学。2012年3月7日にオリジナル(PDF)からアーカイブされました。2013年11月20日取得
  4. ^ ピーターヴァンロイ(2009-05-12)。「プログラミングパラダイム:すべてのプログラマーが知っておくべきこと」(PDF)info.ucl.ac.be。_ 2014年1月27日取得
  5. ^ ピーター・ヴァン・ロイ; Seif Haridi(2004)。コンピュータプログラミングの概念、技術、およびモデルMITプレス。ISBN 978-0-262-22069-9
  6. ^ フランク・ルービン(1987年3月)。「」「GOTOConsideredHarmful」「ConsideredHarmful」 (PDF)。ACMコミュニケーション。30(3):195–196。doi10.1145/214748.315722。S2CID6853038   2009年3月20日にオリジナル(PDF)からアーカイブ
  7. ^ ハーパー、ロバート(2017年5月1日)。「もしあれば、プログラミングパラダイムとは何ですか?」FifteenEightyFourケンブリッジ大学出版局。
  8. ^ Krishnamurthi、Shriram(2008年11月)。「リンネ後の時代にプログラミング言語を教える」SIGPLANACM。pp。81–83。いいえ。43、11。
  9. ^ フロイド、RW(1979)。「プログラミングのパラダイム」ACMの通信22(8):455–460。土井10.1145 /359138.359140
  10. ^ 「モードの​​継承、クローン作成、フック、OOP(Googleグループディスカッション)」
  11. ^ 「ビジネス用語集:シンボリックプログラミング定義」allbusiness.com 2014年7月30日取得
  12. ^ 王、飛; デッカー、ジェームズ; ウー、シルン; エッサーテル、グレゴリー; Rompf、Tiark(2018)、Bengio、S。; Wallach、H。; Larochelle、H。; Grauman、K。(eds。)、"Backpropagation with Callbacks:Foundations for Efficient and Expressive Differentiable Programming" (PDF)Advances in Neural Information Processing Systems 31、Curran Associates、Inc.、pp。10201–10212、2019-02取得-13
  13. ^ イネス、マイク(2018)。「機械学習とプログラミング言語について」(PDF)SysML Conference20182018-09-20にオリジナル(PDF)からアーカイブされました2019-02-13を取得しました。
  14. ^ 「マルチパラダイムプログラミング言語」developer.mozilla.orgMozillaFoundation2013年8月21日にオリジナルからアーカイブされました。

外部リンク