混沌のプログラミングパラダイム
Pythonのイテレータなどを調べていて「関数型プログラミング HOWTO — Python 2.7ja1 documentation」なんてドキュメントが目に留まった。
関数型プログラミングというのが気になって...
関数型プログラミングはプログラミングパラダイムなんだだそう。
ではプログラミングパラダイムってなんだ。
という事で、関数型プログラミングを調べる前に、まずはプログラミングパラダイムから。
【 目次 】
プログラミングパラダイムにもいろいろとあって、なにがなにやら。
プログラミングパラダイム
プログラミングパラダイムというのがあって、プログラマにいろいろとプログラムの見方を与えるものという事のようだ。
- プログラミングパラダイム - Wikipedia
プログラミングパラダイムは、プログラマにプログラムの見方を与えるものと言える。
たとえば、オブジェクト指向プログラミングにおいて、プログラムとはオブジェクトをつくりそれを管理するものである。
関数型プログラミングにおいては、状態を持たない関数の評価の連続である。
アルゴリズムとはまた別に、どのような考え方でプログラミングの処理の仕方を解釈するかという事みたい。
マルチパラダイムプログラミング言語というのがあって、複数のプログラミングパラダイムを取り入れた言語という事。
「オブジェクト指向プログラミングと関数型プログラミングのマルチプログラミングパラダイムを取り入れた言語」というような使い方をするようだ。
してみると、pythonもマルチパラダイムプログラミング言語という事ができるかな。
そもそもパラダイムとは
- パラダイム(ぱらだいむ)とは - コトバンク
ある特定の時代や特定の専門分野において多くの人びとが共有している、ものの見方や思考の枠組みのこと。
プログラミング言語の分け方にもいろいろあって、代表的と思われるものをあげてみた。
構造化プログラミングと非構造化プログラミング
パソコンでBASIC言語の次にくる言語はPascalと言われた時代、「かのダイクスラ先生いわく」ともてはやされた構造化プログラミング。
パソコンが登場した当時にこれしか無くて使わざるを得なかったN88BASICなんてのは、代表的な非構造化プログラミングと言っていいのだろう。
スパゲッティプログラムでないとプログラムが書けなくて、メンテに苦労した。
命令型プログラミング
命令型プログラミングと次の手続き型プログラミングはほぼ同じもののよう。
プログラムの命令を順番に並べて上から順に(jampする事もあるので逐次的にというべきか)処理をおこなうというものかな。
多分ほとんどのプログラミング言語は命令型プログラミングの要素を持っていると言っていいと思う。
手続き型プログラミング
手続き型プログラミングというのは、プログラミングの切り口を手続き(プロシジャ)に注目したときの命令型プログラミングの呼び方という事なのかな。
- 手続き型プログラミング - Wikipedia
「手続き呼び出し」の概念に基づくプログラミングパラダイムの一種。 命令型プログラミングと同義に扱われることが多い。
- プロシージャとは|procedure|プロシージャー - 意味/解説/説明/定義 : IT用語辞典
宣言型プログラミング
- 宣言型プログラミング - Wikipedia
宣言型プログラミング(英: Declarative programming)は、プログラミングパラダイムの名称だが、2種類の意味がある。第一の意味は、処理方法ではなく対象の性質などを宣言することでプログラミングするパラダイムを意味する。
第2の意味は、純粋関数型プログラミング、論理プログラミング、制約プログラミングの総称である。
...
第1の定義によれば、ある出力を得るにあたってそれを作成する方法ではなく、出力の性質を記述することを「宣言型」と称する。
例えば、HTMLは、ページがどう見えるかを記述するものであるため、宣言的である。
HTML はタイトルやフォントやテキストや画像を指定するが、具体的にコンピュータの画面にどう出力するかは記述しない。
...
別の定義では、純粋関数型言語/論理プログラミング言語/制約プログラミング言語で書かれたプログラムを「宣言型」と称する。この立場では、「宣言型プログラミング」とはそのようなプログラミング言語のグループ全体の総称であり、命令型言語と対立する概念である。 ...
命令型プログラミング言語であっても、プログラムを宣言型のスタイルで書くことは可能である。
命令型プログラミング(手続き型プログラミング)と対立する概念であるという事。
命令型プログラミングでは無い関数型プログラミング,SQLに代表される問い合わせ言語, はたまた随分前にAIで話題になったPrologなどの論理プログラミング,制約プログラミングなどがこれに分類されるよう。
- 関数型言語 - Wikipedia
- 問い合わせ言語 - Wikipedia
- 論理プログラミング - Wikipedia
制約プログラミング - Wikipedia
制約プログラミング(Constraint Programming)は、変数間の関係を制約という形で記述するプログラミングパラダイムの一種である。 制約が他の言語のプリミティブと異なるのは、実行すべきステップではなく、解の特性を記述するという点である。制約プログラミングにおける制約は様々である。 制約充足問題での制約やシンプレックス法における制約などがある。制約は通常、プログラミング言語に埋め込まれているか別個のライブラリで提供される。
「命令型プログラミングと対立する概念」といってもJavaやC#などの命令型プログラミング言語でも関数型プログラミングのため機能が追加されていて関数型のプログラミングスタイルがとれるという事か。
でもって、宣言型プログラミングは非手続き型言語とも言うようだ。
手続き型言語の対義語にあたる。
手続き型言語に対するアンチテーゼとして非手続き型という分類が生まれた。
宣言型言語 (Declarative language)と同義に扱われることが多い。
オブジェクト指向プログラミング
今じゃあたりまえのオブジェクト指向プログラミング。
オブジェクト指向プログラミングと言ってもクラスベースのオブジェクト指向とプロトタイプベースのオブジェクト指向というものがあって、ふつうはみんなクラスベース,でもJavaScriptはプロトタイプベース。
JavaやC#は手続き型プログラミングの要素を持っているが、分類するならオブジェクト指向プログラミングに入るって事。
DIとアスペクト指向プログラミング
「Spring Framework」や「Seasar」で有名なDIとAOP(アスペクト指向プログラミング)。
Java にアスペクト指向的要素を追加したAspectJという言語もある。
ドメイン固有言語
プログラミングパラダイムでは無いがドメイン固有言語っていうくくりがあって、
- ドメイン固有言語 - Wikipedia
ドメイン固有言語(ドメインこゆうげんご、英: domain-specific language、DSL)とは、特定のタスク向けに設計されたコンピュータ言語を意味する。 ドメイン特化言語あるいは単にドメイン言語とも呼ばれるが、学術的にはドメイン特化言語と呼ばれることが多い。 C言語やJavaのような汎用のプログラミング言語の対照とされる。
つまり、汎用のプログラミング言語に対して、特定の分野向けの言語って事か?
蛇足
プログラミングパラダイムには、手続き型プログラミング(もしくは命令型プログラム)と非手続き型言語(すなわち宣言型言語)というものがあって、
関数型言語は宣言型言語に分類されるという事か?
で、pythonはオブジェクト指向プログラミングであり手続き型プログラミングでもあり,関数型プログラミングもできるのでマルチパラダイムプログラミング言語というわけか?
ほかにも
動的型付け言語と静的型付け言語という分け方も。
- プログラミング言語をいろんな視点で分類してみた - slow living in the sky
- 動的型付け: 実行時に型が決定される型システム
- 静的型付け: コンパイル時に型が決定される型システム
Rubyの作者のプログラミング言語論も参考に。
技術の広場 - まつもとゆきひろのプログラミング言語論---目次:ITpro
もっとほかにも
- シニアエンジニアの庵 - プログラミング言語
- Triplanner: プログラミング言語の分類
- 10年後も通用する基本って何だろう - 第3回 3つのプログラミングのパラダイムを押さえておこう:ITpro
昔は良かったなぁ、単純で!
構造化プログラミングの時代には七面倒臭い事を考えずに済んで。
世の中がだんだん複雑になってきて、便利な反面,わけがわからなくなってきた。