宣言的プログラミング vs 手続き型プログラミング

関数型プログラミング(Functional Programming)の基本理念を理解するためには、「宣言的プログラミング(Declarative Programming)」と「手続き型プログラミング(Procedural Programming)」の違いを明確にすることが重要です。以下にそれぞれの特徴と、両者の比較を詳しく説明します。


1. 宣言的プログラミング(Declarative Programming)

概念
宣言的プログラミングは、「何をしたいのか」に焦点を当て、処理の目的を記述するスタイルです。処理の流れやステップを逐一指定するのではなく、最終的な結果をどのように得たいかを記述します。

特徴

  • 実行手順(how)ではなく、**目的(what)**に重点を置く。

  • 状態や変数の変更を避け、副作用のない記述を重視する。

  • プログラムの抽象度が高く、読みやすく保守性に優れる。

  • 例:SQLクエリ、HTML、関数型プログラミング(Haskell、Scala、Elmなど)

関数型プログラミングとの関係
関数型プログラミングは宣言的プログラミングの代表的なスタイルであり、「状態を持たない関数」「副作用の排除」「純粋関数の活用」などにより、宣言的なアプローチを実現します。


2. 手続き型プログラミング(Procedural Programming)

概念
手続き型プログラミングは、「どのように実行するか」という**手順(処理の流れ)**を明確に記述するスタイルです。命令の列を記述し、それに従ってコンピュータが処理を進めます。

特徴

  • 逐次的な命令の羅列で、**制御フロー(if, for, whileなど)**を多用する。

  • 状態の変化変数の更新が頻繁に発生する。

  • 実装の細部まで制御できるため、動作が明確だが、複雑になると保守性が低下しやすい。

  • 例:C、Pascal、Python(命令的な使い方)、JavaScript(従来のスタイル)

関数型プログラミングとの違い
関数型では状態を持たない純粋な関数が主役なのに対し、手続き型では状態を持つ変数が中心となり、可変状態副作用のある手続きが一般的です。


3. 宣言的 vs 手続き型:比較表

項目 宣言的プログラミング 手続き型プログラミング
フォーカス 何をするか(What) どうやってするか(How)
状態の管理 状態を持たず、副作用を避ける 可変状態を使用することが一般的
制御構造 抽象化された構文や関数を利用 逐次命令、ループ、条件分岐を多用
抽象度 高い 低い(実装に近い)
保守性 高い(バグが少なく、再利用性が高い) 複雑になると低下しやすい
言語例 Haskell、Scala、F#、SQL C、C++、Java(手続き的記述)、Pythonなど

4. 実例:リスト内の偶数を2倍して取得する

手続き型の例(Python風)

python
result = [] for x in numbers: if x % 2 == 0: result.append(x * 2)

宣言的(関数型)スタイルの例

python
result = map(lambda x: x * 2, filter(lambda x: x % 2 == 0, numbers))

あるいはHaskell風に書くと:

haskell
result = map (*2) (filter even numbers)

5. まとめ

関数型プログラミングは「宣言的プログラミング」に分類され、「どうやって」よりも「何を」に重点を置くことで、コードの簡潔さ・安全性・保守性を高めることができます。一方、手続き型プログラミングは、逐次的な命令と状態の変化に基づく設計であり、柔軟性がある反面、複雑な状態管理が必要になる場面ではバグの温床となりやすいです。プログラミングスタイルの選択は、目的や文脈に応じて使い分けることが重要です。

生成日:2025/06/01