命令型プログラミング と 宣言型 の違い
公開日: 更新日:分享
端的に
- 命令型は動作を作り込むイメージで
- 宣言型は設定を書いておくイメージ
実際には、宣言型自体が命令型をすごくシンプルに使えるようにしたものと言ってもいいかもしれません。
補足
もうちょっとだけ詳しく
命令型プログラミング
- ボタンを押したらon_click()を起動しなさい
- aが0ならば
- aを1にしなさい
- ボタンの背景を赤くしなさい
- aが1ならば
- aを0にしなさい
- ボタンの背景を黒くしなさい
- aが0ならば
という風に on_click() を作り込んでいきます。
「〇〇しなさい」という命令を並べるから命令型。
PHP、Python、C++、Rubyなどをなんとなくイメージすると良いでしょう🧐
宣言型プログラミング
- aが0の時は、ボタンの色は黒とする
- aが1の時は、ボタンの色は赤とする
と設定する作業が中心のイメージでいいかもしれません。
作り込みは、変数の中身だけを書き換えていったり、あらかじめ言語側に用意されている式を呼び出すだけ、のような方向性です。
「〇〇とする」という宣言を並べるから宣言型。
HTML、CSS、SQL、React、外部APIの呼び出し、などをなんとなくイメージすると良いでしょう🧐
なぜ間違えやすいか
全体的に難しいし怖いので、学習コストが高すぎる
- 単語が難しい
- モジュール性、冪等性、参照透過性、などなど
- 翻訳前の英語も、みたことがない単語だらけ
- 手続型という表現もよく出てくるがそもそも「手続き」とは一体...
- 検索結果の圧が強い(ただしこれは、エンジニアさんたちの頭の良さと誠実さからきています)
- 説明自体がほぼ論文=長い、難しい、細かい(厳密)
- 微妙な間違いや説明不足に大量の修正コメントがつく文化
- 宣言型の一種の「関数型」の例示言語が割とマニアックで、イメージがわきにくい
- Haskell、LISP、Scala、Erlang、などなど
- Haskell、LISP、Scala、Erlang、などなど
結果「全然わかりません!!!」となりがち。
「似てるけど違う」概念が多すぎる
- 「意味の範囲は近いけど厳密には違う親戚的な用語」がめちゃくちゃたくさんある上に、名前に関連性が見えない
- 命令型と手続き型とオブジェクト指向
- 宣言型と関数型とラムダ式
- 命令型の一種である手続き型で動作を記述する仕組みの中心である「関数」と、宣言型の一種である関数型の「関数」は違う、など
混乱するだけでなく検索が難しいですよね。
実際問題として、どっちも混ざってる
- 命令型の一種のオブジェクト指向の中核にある「カプセル化」という考え方は、実質的には使い勝手を宣言型に近づけるための仕組みだし
- 宣言型の一種の関数型で呼び出す式自体の定義は「命令型プログラミング的な作法で作る」ことが多いし
- 各言語は別の言語のいいところを取り込んで進化するため、どんどん似てくる
なので「この言語はこれ!」と綺麗に定義するのは実質的にほぼ不可能で、ちゃんと言おうとすると「〇〇という言語は、比較的手続き型の作法で作られている部分が多い」的な説明になってしまいます。
そもそも全言語はCPUの命令に変換されるので、何を使っても最終的には命令型になるというのもややこしいポイント。
だから実はみんな割とふわっとした理解で使いがち
(私含め🤣)
もっと詳しく
「命令型プログラミング 宣言型プログラミング」のGoogle検索結果
新しいタブが開きます