プログラミングパダイムのひとつとして、よく出てくる命令型プログラミング(手続き型プログラミング)の意味と特徴を整理してみました。
正確さや厳密さよりも、なんとなく定義のイメージがわけばいいなと思っています。
目次
命令型プログラミングの考え方とは
命令型プログラミングとは、「命令文の繰り返しにより、変数の値(=状態)を動的に変化させ、計算を行うプログラミングのこと」です。
別の表現で言い換えると、「データ構造を構築し、それに対し計算を実行するためのアルゴリズム(命令文の列)を記述する」というプログラミングパラダイムのことです。
最初の高級言語のプログラミングパラダイム
プログラミング言語の誕生の歴史は、下記の順になっています。
機械語
↓
アセンブリ言語
↓
命令型言語(手続き型言語)
↓
その他の高級言語(オブジェクト指向言語、関数型言語など)
一般に高級言語というのは、機械語、アセンブリ言語以外のすべてのプログラミング言語のことです。
「高級」というのは、人間に近いという意味で、ハードウエアから離れる(ハードウエアを抽象化する)ことを高級と表現されています。
高級言語の考え方は、「プログラムのすべてをアセンブリ言語で書く必要は無く、高級な記述から機械語を生成すれば良い」という考え方です。
手続き型プログラミングは、オブジェクト指向プログラミングや関数型プログラミングと並んでよく出てくるのですが、抽象度という観点からみると階層が違うんじゃないかと思います。
世界最初の高級言語となるFortranは、アセンブリ言語による開発の労力を削減することを目的として誕生しています。
「私がこの仕事をしたのは面倒くさがりだったからです。私はプログラムを書くことが好きではなかったので、IBM 701でミサイルの軌道計算プログラムを開発したときに、プログラムの開発を簡単にするためにプログラミングシステムを作り始めました。」
FORTRAN
命令型プログラミングの計算モデルはノイマン型コンピュータ(状態モデル)
現在のPCは、ノイマン型コンピュータが主流で下の画像のように構成されています。
ノイマン型コンピューターとは、「メモリ中のデータとコンピューターの内部状態に従い、 メモリのデータを逐次的に書き換える計算機」です。
「計算するとはどういうことか」を定義することを計算モデルと言います。
ノイマン型コンピューターにおける計算とは、計算機の内部状態を変えてゆくものであり、状態モデルと言われています。
アセンブリ言語では、 たくさんの色んな命令群(ニーモニック)を使用して、 状態(記憶装置の記憶内容)を書き換えていってプログラミングします。
- メモリの読み書き (load, store)
- 演算 (add, sub, mul, div など)
- 制御命令 (call, jump など)
すごく大変です。(CASLのサンプルコード)
アセンブリ言語は大変なので、状態操作の命令群を抽象化して、使いやすくしようとして生まれたのが手続き型プログラミングのパラダイムと言えるのかなと思います。
アセンブリ言語と比べると、かなり楽ちんになります。
命令型プログラミングのまとめ
命令型プログラミングは、アセンブリ言語よりも使いやすい、状態モデルに基づいたプログラミングパラダイムだと述べました。
命令型プログラミングについて、まとめます。
命令型プログラミングとは、状態を変えるための命令手順書(命令文の集まり)によるプログラミングのこと。
そして、命令文は3種類に分類できます。
- 代入文: 状態(変数)を変化させる。
- 宣言文:プログラムの解釈を変える。
変数の値に関する仕組み = データ型 - 制御文: 命令の順序を決める。
命令を構造化する仕組み = 構造化プログラミング
これらの命令文を使ってプログラミングしていくのが、命令型プログラミングです。
手続き型プログラミングとは何か
よく、手続き型プログラミング言語 = 命令型プログラミング言語であるみたいな記述を見かけます。
私は最初どういうことかわからなかったです。
違うから別の名前がついているはずなのに、なぜ同じとして扱われているんだろうと。
日常生活の中ではなく、この文脈で出てくる「手続き」とは、あくまで下記を意味します。
手続き = 命令を機能別にまとめる仕組み
手続きは、プロシージャー、サブルーチン、メソ ッド、関数などと呼ばれますが、ただ命令をまとめただけで、それ以上の意味を持ちません。
つまり、命令型プログラミングに命令をまとめるための機能がついていれば、手続き型プログラミングということになるということです。
手続き型プログラミングは、命令型プログラミングを内包しており、ただ便利になっているだけで、本質的には命令型プログラミングと変わらないので、同等に扱っても特に問題ないということなんでしょう。
手続き型プログラミングの特徴とは
メリット
手順を順番に記述していけばプログラミングできるので、実装が簡単にできる。
デメリット