閉じる

宣言型 vs 手続き型|初心者でも理解できる本質的な違い

宣言型と手続き型の違いは、プログラムを書くときに「何をしたいか」と「どうやってやるか」のどちらに重心を置くか、という考え方の差です。

本記事では、初心者の方でもイメージしやすいように、図解とサンプルコードを使って、両者の本質的な違いを丁寧に解説していきます。

宣言型と手続き型とは何か

宣言型と手続き型をひとことで表すと

宣言型と手続き型の違いを、もっともシンプルに表すと次のようになります。

手続き型は「どうやってやるか(手順)を書くプログラミング」です。

宣言型は「何を実現したいか(結果・条件)を書くプログラミング」です。

手続き型では、コンピュータに対して「1歩目にこれをして、2歩目にこれをして……」と、順番を細かく命令します。

一方、宣言型では「こういう状態にしてほしい」「この条件を満たすものがほしい」とゴールや条件を伝え、その達成方法はコンピュータ側に任せるイメージです。

代表的な例となる言語

完全にどちらか一方だけ、という言語は少ないのですが、一般的なイメージとして次のように分類されます。

種類代表的な例主な用途
手続き型C、古いスタイルのC++、BASIC などシステムプログラミング、組み込みなど
宣言型(関数型・データベース)SQL、HTML、Haskell、(宣言的スタイルの)JavaScriptなどデータベース操作、Webマークアップ、データ変換など

多くの言語は両方の書き方をある程度サポートしているため、「この言語は宣言型です」と断言しきれない場合もあります。

大事なのは言語の名前よりも、書き方のスタイルそのものと考えることです。

コードで比較する「宣言型 vs 手続き型」

例題: 配列の中から偶数だけを取り出す

宣言型と手続き型の違いが分かりやすい例として、次のような問題を考えます。

[1, 2, 3, 4, 5, 6] という配列から、偶数だけを取り出す、という問題です。

手続き型での書き方(C言語)

手続き型では、ループを使って1つ1つの要素を自分でチェックしていきます。

C言語
#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を使います。

JavaScript
// 元の配列
const numbers = [1, 2, 3, 4, 5, 6];

// 宣言型スタイル: 「偶数だけ欲しい」と条件を宣言する
const evens = numbers.filter((n) => n % 2 === 0);

// 結果を表示
console.log("偶数:", evens);

想定される実行結果は次のとおりです。

実行結果
偶数: [ 2, 4, 6 ]

ここでは「配列から偶数だけを取り出す」という目的(条件)を、そのままコードとして表現しています。

  • 「ループをどう回すか」
  • 「どこに結果を保存するか」

といった細かい手順は、filterという仕組みの内部に任せている状態です。

プログラマは「何が欲しいか」だけを宣言しているため、宣言型の考え方に近づきます。

思考の違いをイメージで理解する

手続き型: 手順書・レシピのように考える

手続き型は、料理のレシピや作業マニュアルをそのままコードにしたようなスタイルです。

例として「ホットケーキを作る」レシピを考えると、次のようになります。

  1. ボウルに卵を割り入れる
  2. 牛乳を入れて混ぜる
  3. ホットケーキミックスを入れて混ぜる
  4. フライパンを温める
  5. 生地を流し入れる
  6. 両面を焼く

プログラムでも、これと同じように、「最初に何をして、その次に何をするか」を1つずつ並べていきます。

時間の流れ(順番)を意識しながら書くのが特徴です。

宣言型: ゴールや条件を指定して任せる

宣言型は、「こういう結果が欲しい」「この条件を満たすものだけ欲しい」とだけ伝えるスタイルです。

身近な例としては、検索エンジンがあります。

「〇〇 レシピ カロリー低め」と検索すると、裏側でどんな順番でサーバが処理しているかは気にしません。

ユーザーは「こういう条件を満たしたページが見たい」というゴールだけ宣言していると言えます。

SQLも同じ考え方です。

例えば次のようなSQLは、宣言型の代表例です。

SQL
SELECT name, age
FROM users
WHERE age >= 20
ORDER BY age;

この1文は「20歳以上のユーザーだけを年齢順に取得したい」というゴールを伝えていますが、データベースの中でどのインデックスを使っているか、どの順番で検索しているかは書いていません

そこが宣言型らしさです。

メリット・デメリットで比較する

手続き型のメリット・デメリット

手続き型のプログラミングには、次のような特徴があります。

メリット 文章でまとめると、次のように言えます。

手続き型は、コンピュータの動作を具体的にイメージしやすく、処理の流れやメモリの使い方を細かく制御できるため、高速化や省メモリ化をしやすいです。

また、プログラミングの基本となる「変数」「条件分岐」「繰り返し」をしっかり学べるので、初心者の学習にも向いています。

デメリット 一方で、処理が複雑になると「どの順番で何をしているか」を追うのが難しくなり、コードが長くなりがちです。

バグが潜みやすく、後から読む人にとって理解しづらくなるという弱点もあります。

宣言型のメリット・デメリット

宣言型のプログラミングの特徴は、次のようにまとめられます。

メリット 宣言型は、「何をしたいのか」をそのままコードで表現しやすいため、コードが短くなり、読みやすくなります。

また、具体的な手順をコンピュータ(ライブラリやエンジン)に任せることで、内部実装の改善(高速化など)の恩恵を自動的に受けられます。

デメリット ただし、「内部で何が行われているか」が見えにくいため、性能チューニングや細かい制御が必要な場面では不利になることがあります。

また、宣言型の書き方に慣れていないと、「なぜこの1行で動くのか」が直感的に分かりにくいと感じる場合もあります。

どんな場面でどちらを使うのか

現代の主流は「組み合わせて使う」

現代の開発では、「手続き型と宣言型のどちらか一方」というよりも、両者をうまく組み合わせることが主流です。

例えば、Webアプリケーションを考えてみます。

  • データベースアクセス部分: SQLという宣言型の言語を使う
  • アプリケーションロジック: JavaScriptやPythonで、手続き型と宣言型を混ぜたスタイルで書く
  • 画面表示: HTMLやCSSという宣言型のマークアップ・スタイル言語を使う

このように、「低レベルで細かい制御が必要な部分」では手続き型、「結果を分かりやすく表現したい部分」では宣言型、というように、適材適所で使い分けるのが実践的です。

初心者はどちらから学ぶべきか

プログラミングをこれから始める方には、次のようなステップをおすすめします。

  1. まずは手続き型で、変数・条件分岐・ループの基本をしっかり身につける
  2. その後、同じ処理を宣言型スタイルで書き直してみて、「何をしたいか」を短く書く感覚を身につける

最初から宣言型だけに頼ると、「内部で何をしているのか」が分からず、トラブル時に対応できなくなることがあります。

逆に、土台として手続き型の感覚を知っておくと、宣言型の便利さも正しく理解しやすくなります

まとめ

宣言型と手続き型の違いは、「どうやってやるか(手順)を書くか」「何をしたいか(結果・条件)を書くか」という発想の違いです。

手続き型は処理の流れを細かく制御しやすく、コンピュータの動きを学ぶ基礎として重要です。

一方、宣言型はコードを短く分かりやすく書けるため、実務の開発で大きな力を発揮します。

実際の開発では、この2つを対立させるのではなく、場面に応じて組み合わせて使うことが重要です。

まずは手続き型で基礎を固め、その上で宣言型の表現力を身につけていくと、理解しやすく実践的な学び方になります。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!