プログラミング言語には様々な設計思想あり、それに従って開発スタイルを決める必要があります。
そういったルールは「プログラミングパラダイム(Programing Paradigm)」と呼ばれ、今日では開発の枠組みとして欠かせない要素となっています。
本記事では、プログラミングパラダイムの基本から歴史、代表的なパラダイムの種類と特徴、うまく活用するためのポイントまで解説していきます。
![Nao Yanagisawa](https://xs691486.xsrv.jp/wp-content/themes/JITERA/images/director-nao-1.png)
2014年 大学在学中にソフトウェア開発企業を設立
2016年 新卒でリクルートに入社 SUUMOの開発担当
2017年 開発会社Jiteraを設立
開発AIエージェント「JITERA」を開発
2024年 「Forbes 30 Under 30 Asia 2024」に選出
プログラミングパラダイムとは
プログラミングパラダイムとは、各プログラミング言語がどんな「考え方」の元に開発されているかを指す言葉です。私たちも日常的にいろいろなパラダイムを使い分けています。
例えば、同じモノを作るにしても、車を作るのかと料理を作るのかで発想の差は歴然です。車は「車体パーツ」を「組み立てたり」します。一方、料理は「材料」を「焼いたり」します。
プログラミング言語にも発想の違いがあり、目的に合わせてパラダイムを使い分ける必要があるのです。適切でないパラダイムを用いると開発プロジェクトの方向性がぶれ、計画が頓挫するといったリスクにつながりかねません。
プログラミングパラダイムを理解することで、設計者と開発間での意見の食い違いを防ぎ、柔軟な開発スタイルが目指せます。
プログラミングパラダイムの歴史
プログラミングパラダイムの歴史は、コンピューターとプログラミング言語の発展と密接に関係しています。
1940年代の電子式計算機の登場時には、機械語による命令型プログラミング言語のみでした。0と1だけの文字列をパンチカードに打ち込んで読み取らせたり、物理的な配線をスイッチしたりと具体性の非常に高いものです。
その後、1960年代に手続き型プログラミング言語が登場し、人でも理解しやすい言語で解釈できるようになりました。
1970年代には長く親しまれているC言語が生まれ、プログラムが抽象的な概念を理解できるようになり、プログラムの可読性が大きく向上したのです。
現在ではさらに多くの設計思想が実用化され、Java・Python・Scalaといった言語が次々と登場し、注目を浴びています。
プログラミングパラダイムの種類
プログラミングには様々なパラダイムが存在し、言語やアプリケーションの目的に応じて使い分けられています。
- 命令型
- 手続き型
- 宣言型
- 関数型
- 論理型
- オブジェクト指向
- イベント駆動型
それぞれ解説していきましょう。
命令型プログラミング
命令型プログラミングは、コンピューターに対して直接的な命令を与えるプログラミング手法です。機械語やアセンブリ言語がこのパラダイムに分類されます。
命令型プログラミングは低水準で記述するため高速に動作しますが、人間にとって可読性が低く、プログラミングはかなりの専門性を必要とし、一般の方に扱えるものではありません。
言語というより「電気信号」や「モールス信号」のような単一的な交信をイメージしてもらうとわかりやすいでしょう。
現在では主に物理的なシステムプログラム(電光掲示板など)の一部で使われる程度で、ほとんどの言語において自動化されているパラダイムです。
手続き型プログラミング
手続き型プログラミングは、プログラムを一連の手続き(ステップ)の集まりとしてモデル化する考え方です。C言語やFORTRAN、COBOLなどの言語がこのパラダイムに従っています。
命令型プログラミングが低水準の機械語で直接コンピューターに命令を出すのに対し、手続き型ではプログラムを手順単位に分割し、各手順にラベルをつけて呼び出す形式をとります。このため可読性は命令型よりも高まり、非常に軽量で高速なのが特徴です。
しかしデータとプログラム(手続き)が密接に結びついてしまっているため、どちらか一方を変更するとプログラム全体に影響が及んでしまうという課題も。
現役システムにも多く利用されているため、いまだ重要な役割を担っています。
宣言型プログラミング
宣言型プログラミングは、プログラムが実行すべき”What(何を)”を宣言するスタイルです。一方で”How(どのように)”実行するかについては記述しません。
結果を宣言するだけで、その実現手順は言語の仕組みに任されているのです。主にウェブシステムや人工知能分野でも活用されています。
例えば、データベースで利用されるSQLはよくある宣言型の言語です。”SELECT * FROM 顧客テーブル”と宣言するだけで、顧客データを取得できます。
HTMLやCSSも宣言型に分類される言語でしょう。HTMLで<h1>見出し</h1>と宣言すれば大きな見出しになり、CSSで”色:赤”と宣言すれば赤色が適用されます。
このように宣言型では、実装の詳細を気にすることなく高度な抽象化が可能です。ただし、言語側の最適化に依存するため、実行効率が手続き型などに比べて劣る側面もあります。
関数型プログラミング
関数型プログラミングは、プログラムを数学の関数の組み合わせとしてモデル化するスタイルです。入力値に対して常に同じ出力値を返す「純粋な関数」が中心的な概念となります。
例えば、足し算の関数f(x, y) = x + yは、xとyという入力値が同じであれば、出力結果も必ず同じになります。関数型言語ではデータに対する操作を全て関数の入出力として扱うため、データ自体に状態が存在しません。
この不変性が特徴の一つです。与えられたインプットを複数の関数にリレーしていくため、数学的な抽象化が可能となっています。
このパラダイムの利点は、並列処理に適していること、テストが容易であることなどが挙げられますが、データの推移などを扱う場面では課題もあります。Haskell、Scala、Erlangなどが代表的な言語です。
論理型プログラミング
論理型プログラミングは、プログラムを論理的な事実と規則の集まりとしてモデル化するスタイルです。データを「事実」、処理のロジックを「規則」として宣言し、それらを組み合わせることでプログラムを実現します。
代表的な論理型言語に「Prolog」があります。Prologではデータごとに「親」「子」のような要素(事実)をラベリングし、「親子は、両者が親と子の関係であること」といった規則を定義します。
そして「データAとデータBは親子であるか?」と質問することで、AとBの関係を規則に基づいて判断してくれる、まさにAI活用が主流のパラダイムです。
手続きそのものを記述する必要がないため、複雑な知識処理はもちろんAI開発の分野でも活躍しています。
制約プログラミング
制約プログラミングとは、問題に対する「制約条件」を記述し、その制約を満たす最適な解を見つける手法のことです。
製造ラインで10個の製品を作る際、作業時間や作業人数、使用機材など様々な制約があるとします。制約プログラミングではこれらの制約を全て数式で表現し、その制約の中で、製品を最短時間で作り上げる最適な手順を導き出すのです。
つまり、制約プログラミングは最適化問題の解決に適したパラダイムだといえます。製造ラインの例の他にも、従業員のシフト管理や輸送ルート最適化、タイムテーブル作成などの問題に役立ちます。
OPL(Optimization Programming Language)などが制約プログラミングの代表例です。一般的なアプリケーション開発では使われることは少ないですが、特定の最適化問題を解く際には有効でしょう。
オブジェクト指向プログラミング
オブジェクト指向プログラミングは、プログラムをオブジェクトの集まりとしてモデル化する手法です。C++、Java、C#などがこのパラダイムの代表的な言語でしょう。
オブジェクト指向では、データとそれを操作する手続き(メソッド)をまとめてクラスと呼ばれる単位で表現し、それらをオブジェクト化して組み合わせることでプログラムを動かします。
関連するデータとメソッドは一つのカプセルに入れられ、外部からのアクセスは制御されます(カプセル化)。これはテレビのリモコンによく例えられます。
私たちはリモコン内部の複雑な回路を知らなくても、ボタンを押すだけでテレビを操作できますよね。開発者は、他の担当者が作ったオブジェクトを利用できますが、その中身は必ずしも知らなくてよいのです。
すると、自分の担当するオブジェクトの実装だけに専念でき、大規模な人数でのシステム開発も滞りなく進められます。
イベント駆動型プログラミング
イベント駆動型プログラミングは、ユーザーの操作やデータの更新など、特定の出来事(イベント)に応じてプログラムが反応する手法です。
主にGUIアプリケーションで採用されており、イベントの発生に従ってプログラムの制御が行われるため、リアルタイム性が非常に高いのが特徴です。
例えば、今この記事を読むために操作しているマウスやキーボードもイベント駆動型として動作しています。
「クリックした」「右に動かした」「Enterキーが押された」といった処理がイベントとしてイベント駆動型プログラムに送られ、それぞれに定義されたレスポンスを返しているのです。JavaScriptやC#などの言語がこのパラダイムの特性を持っています。
プログラミングパラダイムの「マルチパラダイム」とは
プログラミングには様々なパラダイムが存在しますが、1つの言語で複数のパラダイムを組み合わせて使えるマルチパラダイム言語も少なくありません。
マルチパラダイムプログラミング言語の意味
マルチパラダイムプログラミング言語とは、複数のプログラミングパラダイムの思想や機能を取り入れた言語のことを指します。
例えば、C++はもともと手続き型言語であったC言語をベースに、オブジェクト指向プログラミングの機能を実装したマルチパラダイム言語といえるでしょう。
マルチパラダイム言語の利点は、プログラマーが目的に応じて最適なパラダイムを使い分けられることです。
ただし、複数のパラダイムを組み合わせるため、言語の複雑さも増してしまう側面があります。柔軟性とパフォーマンスのバランスを取るのが課題となる高度な言語です。
マルチパラダイムプログラミング言語の種類
ここではマルチパラダイムプログラミング言語とされているものをご紹介します。
- JavaScript
- Python
- C++
- C#
- Scala
順番に解説していきます。
JavaScript
JavaScriptは、ウェブ開発を想定したオブジェクト指向のスクリプト言語でしたが、2015年頃にリリースされたエディション(ECMA Script 6)から関数型の機能も取り入れられ、マルチパラダイム言語となりました。
関数型の機能をもったことで、さらに抽象度の高い動作を実現します。HTMLやCSSと並んで親しまれているウェブ系フロントエンド開発の言語として、現在もプログラマーからの人気が高い言語でしょう。
Python
Pythonは手続き型、オブジェクト指向、さらに関数型のパラダイムを取り入れたマルチパラダイム言語です。
簡潔な文法でありながら、強力な機能を持つため、データ分析やウェブアプリケーション、機械学習など様々な分野で活用されています。
読みやすく効率もよいコードを簡単に書けるようにする、という思想に基づいた設計がされており、その単純明快さからプログラマーでない方でも比較的利用しやすいマルチパラダイム言語といえます。
C++
C++(シープラプラ)はC言語の手続き型の機能に、オブジェクト指向のパラダイムを取り入れた言語です。
システムプログラミングからゲーム、金融システムまで、パフォーマンスが求められる分野で広く使われています。
手続き型言語として古い歴史を持つC言語をベースにしていることもあり、動作が高速かつ快適です。最新の開発まで広くカバーできる汎用性は、他言語にはみられない強みでしょう。
C#
C#は.NET Frameworkで動作する、マイクロソフト製のマルチパラダイム言語です。非常に多くのパラダイムに対応しており、命令型、宣言型、関数型、オブジェクト指向など、開発現場に応じて柔軟にスタイルを選べます。
LINQ(Language INtegrated Query)を利用することで、SQL風の構文でのデータ処理も得意としているため、汎用性に優れた言語といえます。主にWindowsデスクトップアプリやウェブアプリの開発に利用されています。
Scala
ScalaはJavaVM(Javaを実行するためのソフトウェア)を実行環境とするマルチパラダイム言語です。オブジェクト指向と関数型、さらに手続き型のパラダイムを組み合わせて柔軟にプログラミングできます。
Scalaでは関数型のパラダイムが強く表れていて、オブジェクトやデータの状態を変更しない不変性が保証されます。
このような性質から、ビッグデータを取り扱う分野に向いています。SNSプラットフォーム「X(旧:Twitter)」の開発言語として2009年からScalaが採用されており、実績のある言語といえます。
プログラミングパラダイムをうまく活用するには
プログラミングパラダイムを活用するためには、目的や規模、性能要件などに応じて、適切なパラダイムを選択していく必要があります。
目的に合ったパラダイムを選択する
目的を見失ってパラダイムを選ぶと、保守性やパフォーマンスに支障をきたす恐れがあります。プロジェクトの本質を捉え、目的に合う最適なパラダイムを選びましょう。
例えば、ゲームエンジンのようにメモリ効率が重要な場合は、動作が軽量な手続き型が適しています。要件が柔軟に変更される可能性の高いウェブアプリなどでは、設計の柔軟性からオブジェクト指向が有利です。
AIなど知識処理が中心となる場合は、データの網羅性が重要視されるといった観点から論理型を選びましょう。
プログラミング言語によっては「どういった考えで設計されているか」といった思想を公開している言語もあります。合わせて参考にしてみてください。
同じパラダイムの言語を把握する
複数の言語を把握しておくことで、プロジェクトに合った最適な言語を選べます。
例えば、オブジェクト指向ならJavaとC++、C#が選択肢になりますし、プログラマーが特定のオブジェクト指向言語に精通していなかったとしても、根本的なパラダイムが統一されていれば学習コストは少なく済みます。
得意分野を選択していくことも大事ですが、同じパラダイムの中から実行環境やライブラリ、それぞれの言語の特性を比較して、最も適したものを採用していきましょう。
単一言語に捉われていると、設計やツールに制限がかかり、効率的な開発が難しくなってしまう可能性があります。同じパラダイムの中からプロジェクトの条件に最も合致するプログラミング言語を選ぶことが、円滑な開発のためには重要です。
パラダイム同士の相性を知る
パラダイムには相性の良し悪しがあります。相性を理解して組み合わせれば、複数のパラダイムの長所を活かし、効率的な開発が可能です。
例えば、関数型とオブジェクト指向は相性が良く、C++をはじめとしたマルチパラダイム言語の多くがオブジェクト指向の考えを取り入れています。
一方で命令型と論理型は相性が悪く、プログラムの表現方法があまりにも異なっています。命令型は決められた答えを出力するための機能に向いているのに、論理型は正解のない答えを出力する機能が求められるためです。
相性を理解せず無理に組み合わせても、開発の障害となります。パラダイム同士の親和性を把握し、うまく組み合わせる工夫が大切です。
マルチパラダイムを取り入れる
1つのパラダイムに捉われず、マルチパラダイム言語の利点を最大限に活かすことが重要です。
Python を例に挙げてみましょう。手続き型プログラミングとオブジェクト指向の機能が組み合わさっているため、大規模なアプリケーションに適しています。関数型を使ってデータ処理を行う点から、顧客データに綿密に結びつくプロジェクトとも好相性です。
Amazonの商品取引システムの一部はPythonによる開発ですし、Instagramを構築しているウェブアプリケーションフレームワーク(Django)もPythonによって開発されている、といった事例があります。
複数のパラダイムを使いこなせば、プログラムの表現力が格段に高まります。しかし、言語の複雑さも高まるので、抽象化の原則やコーディング規約の策定をしっかりと共有しておくことが大切でしょう。
プログラミングパラダイムを理解すれば開発に有利
ここまで、プログラミングパラダイムの基本から歴史、代表的なパラダイムの種類と特徴、うまく活用するためのポイントを解説してきました。
様々なパラダイムの特徴を知り、情報収集していくことが適切なアプリ開発への第一歩といえるでしょう。
当社Jiteraでは、アプリ・システム開発を積極的に行っています。小さなスタートからビジネスを確実に前に進める開発をサポートさせて頂いております。
プログラミングパラダイムに関するご相談やご質問がありましたら、Jiteraまでお気軽にお問い合わせください。最適なソリューションをご提案させていただきます。