プログラミングパラダイムとは、プログラミングで解決したい問題に対して、どのように記述していけば解答を得ることが出来るか、その考え方の枠組みやスタイルを表すものです。言語に対してプログラミングパラダイムは一つとは限りません。マルチパラダイムと言って、複数のパラダイムを合わせ持つ場合もあります。
プログラミングパラダイムは、新しく言語を習得する際の難易度の指標ともなります。既に習得している言語がある場合に、同じプログラミングパラダイムを持つ言語は習得しやすいと言えます。異なるプログラミングパラダイムの場合は、基礎知識無く習得する場合と同じくらいの難易度になりますが、新しいアプローチで問題を解決に導く事が出来るようになります。
- プログラミングパラダイムとは、プログラムを組む上での考え方で、具体的には「命令型」「宣言型」「関数型」などがある
- プログラミング言語によって、得意・不得意、記述可能・不可能なプログラミングパラダイムは異なる
- 同じプログラミングパラダイムを持つ言語は、別言語であっても習得がしやすい
主なプログラミングパラダイム
プログラミングパラダイムは大きく分けて命令型、宣言型があります。これらは逆の性質を持つプログラミングパラダイムです。これらの分類にまたがる大きな分類として、オブジェクト指向プログラミングという分類もあります。
命令型には「手続き型」、宣言型には「関数型」「論理型」のプログラミングパラダイムがあります。
以降では各プログラミングパラダイムの概要について説明します。それぞれのプログラミングパラダイムには、メリットとデメリットがあり、開発する目的や解決したい問題によって向き不向きがあります。
もしこれから学ぶプログラミング言語を選択する場合は、このメリットデメリットが選択のカギとなりますので是非参考にしてみて下さい。
命令型プログラミング
命令型プログラミングは「手続き型プログラミング」とほぼ同義で扱われることが多いです。プログラミングで解決したい問題の解答を得るために、「命令」や命令をひとまとまりに連結した「手続き」を組み合わせて記述していくものです。この「手続き」は言語によって名前が異なり、「プロシージャ」「サブルーチン」「関数」「メソッド」などと呼ばれます。
命令型でよく見る言語としては、C#、、C++、Java、Ruby、PHP、Python等があり、実践で使用されているほとんどのメジャーな言語は命令型に分類されます。
命令型は命令の組み合わせによってシステムの状態(変数、オブジェクト変数など)を変更します。たとえば複数の処理で参照している変数がある場合に、ある処理が変数の内容を変更した後に別の処理でその変数の内容を参照すると、思った結果が得られないことがあります。
このように、命令の組み合わせで状態が変更されることにより、入力に対して予期せぬ結果が出力されてしまうことを「プログラミングの副作用」と呼びます。命令型のプログラミングではこの「プログラミングの副作用」が起こりやすいと言われています。その反面、ある計算結果を利用して次の計算をするような、状態遷移のある処理を記述するのに向いています。処理系をブラックボックス化せず記述していくため、性能のチューニングがしやすく、命令型プログラミングに分類されている言語は業務システムやWebシステム等で主流になっているものが多いです。
宣言型プログラミング
宣言型プログラミングでは命令型のように処理の手順を記述するのではなく、問題の性質や意味、制約を記述します。定義した問題の解決に至るまでの処理手順については、プログラミング言語の処理系に任せる考え方です。
宣言型プログラミングで身近な言語にSQLがあります。SQLでは、どのようなデータを(時にはどのような順番で)取ってくるかを指定しますが、データを取ってくるためのプロセスについて記述することはありません。解の出し方についてはSQLクエリに任せています。
前述したように、宣言型プログラミングに分類される代表として「関数型プログラミング」と「論理言語型プログラミング」があります。
関数型プログラミング
関数型プログラミングでは、プログラムは関数の組み合わせによって表現されます。ここで言う関数は命令型で言う「関数」とは異なり、数学的な関数を意味します。言語としてはHaskell、LISP、Scala等があります。
関数型プログラミングでは命令型プログラミングの章で前述した「副作用」は基本的に排除する考えがあり、副作用は起こりにくいといわれています。入力に対して同じ出力が返却されるため、プログラムはシンプルなものになります。
また、関数型プログラミングは拡張性が高いこともメリットとして挙げられます。言語自体の機能を拡張でき、文法自体を変更することも可能です。ただし、標準化が進んでいない関数型の言語では、言語自体のの機能をした場合に環境によって動作しないことも有り得ます。そのため、関数型の言語を選択する上で、標準化の進んでいる言語を選択する事も重要になります。
現役エンジニアからフィードバックが受けられるプログラミングスクールはこちら
論理型プログラミング
論理型言語では関数ではなく関係を扱い、プログラムは論理式の組み合わせによって表現されます。言語でいうと1972年頃から開発されたPrologが論理型言語の代表です。Prologは歴史の古いプログラミング言語ですが、自然言語の理解等のAIに特化した言語として使われています。有名なところではソフトバンク社が開発するロボット、Pepperが会話するときの処理に使われています。
Prologでは、事実(物事の事実)と規則(物事との関係についての規則)を積み上げて記述していき、最後に質問を与えることで、処理系が推論して解答を導き出します。
条件が決まると解が決まるが、解法のプロセスを定義するのは難しい問題を扱う場合に適しています。逆に、解を導くためのプロセスが決まっているような問題の場合は適していません。
オブジェクト指向プログラミング
前述したように、命令型と宣言型とはまた異なるベクトルで分類されるのがオブジェクト指向言語です。オブジェクト指向の言語としては、C#、、C++、Java、Ruby、PHP、Scala等があり、一般的に使われている言語はオブジェクト指向に基づいていることが多いと言えます。
オブジェクト指向言語では、対象(オブジェクト)をデータとメソッドのかたまりで扱います。データとは変数を表し、メソッドはオブジェクト内のデータの操作を行う命令です。
オブジェクト指向のプログラミングでは、
- オブジェクトのテンプレート(クラス)を定義
- クラスからオブジェクト(インスタンス)を作成
- オブジェクト間でのメッセージ送受信によってオブジェクトを操作する
といった一連の記述をしていきます。
ここで、クラスは対象を抽象化したもので、インスタンスは具体化された対象を表します。たとえば猫には色んな猫がいますが、これらに共通している属性を切り出して抽象化すると、猫クラスは「名前」「年齢」といった属性を持ち、「ニャーと鳴く」「ごはんをたべる」といったメソッド等、猫に共通する属性を持ちます。
オブジェクト指向では、オブジェクトを設計する際にシステム化の対象となるものの抽象化を行うことで、システム全体を単純化して表現します。この設計方法は、システム化の対象が多い大規模開発で効果を発揮します。また、この考え方はプログラミングだけでなく、業務分析等の上流工程においても利用することができます。
まとめ
今回は、現時点で主流となるプログラミングパラダイムを中心に解説しました。プログラミングパラダイムは、プログラミングで解を求めるための考え方の枠組みやスタイルを表します。プログラミングパラダイムの中には「命令型」と「宣言型」があり、これらとは別のベクトルに「オブジェクト指向」という大きな分類があります。
それぞれのプログラミングパラダイムには一長一短あり、得意分野があります。プログラミング言語の選択する場合は、それぞれのプログラミングパラダイムの特徴を踏まえて、それに該当する言語を選択するようにしましょう。
基本的なプログラミングスキルに不安があるというあなたは、ポテパンキャンプのようなオンラインスクールの利用も検討するとよいでしょう。