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

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

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

プログラミングパラダイムとは、プログラミング言語における考え方、言語の利用方法や枠組みを規定するものです。
世の中には様々なプログラミング言語が存在しますが、各言語はそれぞれ固有の特徴を持っており、その実装方法も異なります。
これはプログラミング言語のパラダイムが違っていることに由来します。


プログラミングパラダイムを検討しなければいけない時は?

ソフトウェア開発において設計(特に詳細設計)を実施する場合には、必ずプログラミングパラダイムを考慮しなければいけません。
例えば、オブジェクト指向設計を実施したにもかからわず、オブジェクト指向プログラミングのパラダイムを持たないプログラミング言語で実装しようとすると、矛盾や実装困難な状況が発生します。
C言語やCOBOLなどを実装言語に選定したプロジェクトで、クラス設計書を渡されても(無理ではないのですが)設計通りに成果物を作成することは上手くいきません。


マルチパラダイムプログラミング言語

マルチパラダイムとは

マルチパラダイムとは、あるプログラミング言語が複数のプログラミングパラダイムに対応していることを意味します。
プログラミング言語は、プログラミングパラダイムと必ずしも一対一で対応しているわけではありません
特定のパラダイムのみ実現するプログラミング言語よりも、「宣言型」「命令型」「手続き型」など複数の特性を併せ持つプログラミング言語のほうが一般的です。


パラダイムによる言語の分類

下記はプログラミングパラダイムついての原理的な言語分類となります。
なお、それぞれの言語は、パラダイムの要素がより強いだけで、実質的にはマルチパラダイムです。
例えば、C#はオブジェクト指向であり、構造化であり、手続き型でもあります。

プログラミングパラダイムと言語の代表例
プログラミングパラダイムプログラミング言語
手続き型プログラミングFortran, C, COBOL, BASICなど、初期の言語に多い。
関数型プログラミングLisp, Haskell, Scheme, Erlang, Elixir, OCaml, Scala
論理型プログラミングProlog, Clojure
オブジェクト指向プログラミングSmalltalk, C++, Java, C#, Go
非構造化プログラミングMS-DOSバッチファイル, BASICの初期のバージョン(MSX BASICなど), 初期のアセンブラシステム


【備考】構造化プログラミングについて

非構造化プログラミングとは

非構造化プログラミングとは、全てのコードが一つの連続したブロックに含まれているプログラミング手法のことです。
コンピュータ黎明期のプログラミングで採用された仕組みであり、ソフトウェアで複雑な処理を行わない時代の考え方です。
何らかの構造をサポートするプログラミング言語(高級言語の全般といって差し支えない)では既に使われない手法です。

理論上、プログラミング言語は「条件文とgoto文の組合せ」でプログラム構造が実装可能であり、それ以外の制御構造は必要ありません。
ただし、そのようなプログラムのソースコードは可読性が低く、バグが混入しやすい上に、デバッグすることが難しくなります。
大規模化すると、スパゲティプログラム(実行順序がスパゲッティのように複雑に絡まり、整理されていないプログラム)ができやすいという難点があります。


構造化プログラミングとは

構造化プログラミングとは、プログラムを構造的に設計し、制御構造を明確にするためのプログラミング手法です。
この考え方は、1969年にアイントホーフェン工科大学(オランダ)のエドガー・ダイクストラ教授によって提唱されました。
複雑で大規模化しつつあるソフトウェアを開発するためのプログラミング言語(ほぼすべての高級言語)において、採用されているパラダイムです


構造化定理とは

構造化定理とは、「順次」・「選択」・「繰り返し」の3つの基本制御構造を用いることで、すべてのアルゴリズムは表現できるという定理です。
構造化プログラミングは、構造化定理を基にした考えとなります。

順次構造上から下へ順番に処理を実行すること。
選択構造条件で分岐させて、いずれかの処理を実行すること。<
繰り返し構造条件が満たされるまで、同じ処理を繰り返すこと。

構造化プログラミングのメリットは?

構造化プログラミングのメリットは、分割統治法(大きな問題を小さな問題に分割して解決する)を用いて、ソフトウエアを開発できることです。
複雑な処理に対して、ソースコードの可読性を向上させ、影響度を限定することで、大人数で協力して設計・開発できるようになります。


【備考】命令型プログラミングと宣言型プログラミングについて

命令型プログラミング(Imperative programming)とは

命令型プログラミングとは、データや変数に対して命令を与え変化させていくことで目的を達成する、というプログラミングの考え方です。
構造的には、メモリ上にデータ構造を構築して状態を表現し、そして機械語命令列をプロセッサが順番に実行して状態遷移を行うという、チューリングマシン的メカニズムです。
より簡単にいえば、「データ構造とアルゴリズムを記述する」プログラミング言語が命令型プログラミングです。
C#、Java、Rubyなど、有名プログラミング言語の多くが命令型に属します。


宣言型プログラミング(declarative programming)とは

宣言型プログラミングとは、対象の性質など(つまり、変数や関数)を宣言することでプログラミングすることです。
構造的には、実行環境に深く依存したデータ構造とアルゴリズムを駆使して、非常に効率的な解法を記述します。
より簡単にいえば、「関数型プログラミング、論理プログラミング、クエリ型」に該当するプログラミング言語が宣言型プログラミングです。
Haskell、SQL、Scala、Prologなどが宣言型に属します。


命令型プログラミングと宣言型プログラミングの違い

命令型プログラミングは、どのように実行させるかを記述します。
宣言型プログラミングは、何をするかを記述(宣言)します。


Imperative = HOW you want
Declarative = WHAT you want


関連ページ