宣言型と手続き型の違いは、プログラムを書くときに「何をしたいか」と「どうやってやるか」のどちらに重心を置くか、という考え方の差です。
本記事では、初心者の方でもイメージしやすいように、図解とサンプルコードを使って、両者の本質的な違いを丁寧に解説していきます。
宣言型と手続き型とは何か
宣言型と手続き型をひとことで表すと

宣言型と手続き型の違いを、もっともシンプルに表すと次のようになります。
手続き型は「どうやってやるか(手順)を書くプログラミング」です。
宣言型は「何を実現したいか(結果・条件)を書くプログラミング」です。
手続き型では、コンピュータに対して「1歩目にこれをして、2歩目にこれをして……」と、順番を細かく命令します。
一方、宣言型では「こういう状態にしてほしい」「この条件を満たすものがほしい」とゴールや条件を伝え、その達成方法はコンピュータ側に任せるイメージです。
代表的な例となる言語
完全にどちらか一方だけ、という言語は少ないのですが、一般的なイメージとして次のように分類されます。
| 種類 | 代表的な例 | 主な用途 |
|---|---|---|
| 手続き型 | C、古いスタイルのC++、BASIC など | システムプログラミング、組み込みなど |
| 宣言型(関数型・データベース) | SQL、HTML、Haskell、(宣言的スタイルの)JavaScriptなど | データベース操作、Webマークアップ、データ変換など |
多くの言語は両方の書き方をある程度サポートしているため、「この言語は宣言型です」と断言しきれない場合もあります。
大事なのは言語の名前よりも、書き方のスタイルそのものと考えることです。
コードで比較する「宣言型 vs 手続き型」
例題: 配列の中から偶数だけを取り出す
宣言型と手続き型の違いが分かりやすい例として、次のような問題を考えます。
[1, 2, 3, 4, 5, 6] という配列から、偶数だけを取り出す、という問題です。
手続き型での書き方(C言語)
手続き型では、ループを使って1つ1つの要素を自分でチェックしていきます。
#include <stdio.h>
int main(void) {
// 元の配列
int numbers[] = {1, 2, 3, 4, 5, 6};
int length = 6;
// 結果を入れる配列
int evens[6];
int count = 0; // 偶数の数
// 手続き型: 具体的な手順を自分で書く
for (int i = 0; i < length; i++) {
// 要素が偶数かどうかを判定
if (numbers[i] % 2 == 0) {
// 偶数なら結果の配列に追加
evens[count] = numbers[i];
count++;
}
}
// 結果を表示
printf("偶数: ");
for (int i = 0; i < count; i++) {
printf("%d ", evens[i]);
}
printf("\n");
return 0;
}
想定される実行結果は次のようになります。
偶数: 2 4 6
このコードでは、次のような「手順」がはっきりと書かれています。
- 配列の長さ分だけ
forで回す - 各要素が偶数か
ifでチェックする - 条件を満たしたら別の配列に詰める
どの順番で、どのような操作を行うかを、プログラマ自身がすべて指定していることがポイントです。
宣言型に近い書き方(JavaScriptの例)
同じ処理を、より宣言型に近いスタイルで書いてみます。
ここではJavaScriptのfilterを使います。
// 元の配列
const numbers = [1, 2, 3, 4, 5, 6];
// 宣言型スタイル: 「偶数だけ欲しい」と条件を宣言する
const evens = numbers.filter((n) => n % 2 === 0);
// 結果を表示
console.log("偶数:", evens);
想定される実行結果は次のとおりです。
偶数: [ 2, 4, 6 ]
ここでは「配列から偶数だけを取り出す」という目的(条件)を、そのままコードとして表現しています。
- 「ループをどう回すか」
- 「どこに結果を保存するか」
といった細かい手順は、filterという仕組みの内部に任せている状態です。
プログラマは「何が欲しいか」だけを宣言しているため、宣言型の考え方に近づきます。
思考の違いをイメージで理解する
手続き型: 手順書・レシピのように考える

手続き型は、料理のレシピや作業マニュアルをそのままコードにしたようなスタイルです。
例として「ホットケーキを作る」レシピを考えると、次のようになります。
- ボウルに卵を割り入れる
- 牛乳を入れて混ぜる
- ホットケーキミックスを入れて混ぜる
- フライパンを温める
- 生地を流し入れる
- 両面を焼く
プログラムでも、これと同じように、「最初に何をして、その次に何をするか」を1つずつ並べていきます。
時間の流れ(順番)を意識しながら書くのが特徴です。
宣言型: ゴールや条件を指定して任せる

宣言型は、「こういう結果が欲しい」「この条件を満たすものだけ欲しい」とだけ伝えるスタイルです。
身近な例としては、検索エンジンがあります。
「〇〇 レシピ カロリー低め」と検索すると、裏側でどんな順番でサーバが処理しているかは気にしません。
ユーザーは「こういう条件を満たしたページが見たい」というゴールだけ宣言していると言えます。
SQLも同じ考え方です。
例えば次のようなSQLは、宣言型の代表例です。
SELECT name, age
FROM users
WHERE age >= 20
ORDER BY age;
この1文は「20歳以上のユーザーだけを年齢順に取得したい」というゴールを伝えていますが、データベースの中でどのインデックスを使っているか、どの順番で検索しているかは書いていません。
そこが宣言型らしさです。
メリット・デメリットで比較する
手続き型のメリット・デメリット
手続き型のプログラミングには、次のような特徴があります。
メリット 文章でまとめると、次のように言えます。
手続き型は、コンピュータの動作を具体的にイメージしやすく、処理の流れやメモリの使い方を細かく制御できるため、高速化や省メモリ化をしやすいです。
また、プログラミングの基本となる「変数」「条件分岐」「繰り返し」をしっかり学べるので、初心者の学習にも向いています。
デメリット 一方で、処理が複雑になると「どの順番で何をしているか」を追うのが難しくなり、コードが長くなりがちです。
バグが潜みやすく、後から読む人にとって理解しづらくなるという弱点もあります。
宣言型のメリット・デメリット
宣言型のプログラミングの特徴は、次のようにまとめられます。
メリット 宣言型は、「何をしたいのか」をそのままコードで表現しやすいため、コードが短くなり、読みやすくなります。
また、具体的な手順をコンピュータ(ライブラリやエンジン)に任せることで、内部実装の改善(高速化など)の恩恵を自動的に受けられます。
デメリット ただし、「内部で何が行われているか」が見えにくいため、性能チューニングや細かい制御が必要な場面では不利になることがあります。
また、宣言型の書き方に慣れていないと、「なぜこの1行で動くのか」が直感的に分かりにくいと感じる場合もあります。
どんな場面でどちらを使うのか
現代の主流は「組み合わせて使う」

現代の開発では、「手続き型と宣言型のどちらか一方」というよりも、両者をうまく組み合わせることが主流です。
例えば、Webアプリケーションを考えてみます。
- データベースアクセス部分: SQLという宣言型の言語を使う
- アプリケーションロジック: JavaScriptやPythonで、手続き型と宣言型を混ぜたスタイルで書く
- 画面表示: HTMLやCSSという宣言型のマークアップ・スタイル言語を使う
このように、「低レベルで細かい制御が必要な部分」では手続き型、「結果を分かりやすく表現したい部分」では宣言型、というように、適材適所で使い分けるのが実践的です。
初心者はどちらから学ぶべきか
プログラミングをこれから始める方には、次のようなステップをおすすめします。
- まずは手続き型で、変数・条件分岐・ループの基本をしっかり身につける
- その後、同じ処理を宣言型スタイルで書き直してみて、「何をしたいか」を短く書く感覚を身につける
最初から宣言型だけに頼ると、「内部で何をしているのか」が分からず、トラブル時に対応できなくなることがあります。
逆に、土台として手続き型の感覚を知っておくと、宣言型の便利さも正しく理解しやすくなります。
まとめ
宣言型と手続き型の違いは、「どうやってやるか(手順)を書くか」「何をしたいか(結果・条件)を書くか」という発想の違いです。
手続き型は処理の流れを細かく制御しやすく、コンピュータの動きを学ぶ基礎として重要です。
一方、宣言型はコードを短く分かりやすく書けるため、実務の開発で大きな力を発揮します。
実際の開発では、この2つを対立させるのではなく、場面に応じて組み合わせて使うことが重要です。
まずは手続き型で基礎を固め、その上で宣言型の表現力を身につけていくと、理解しやすく実践的な学び方になります。
