はじめに
RubyやJava等、現在主流になっているプログラミング言語の多くは
"オブジェクト指向(OOP)のプログラミング言語" です!!
オブジェクト指向について理解しようとしても、抽象的な概念であり、目に見えない世界のものなので
なかなか理解するのが難しいと思います。
私も色々なサイトで調べてわからなかったので、
有名な【オブジェクト思考でなぜつくるのか】という本を購入しました!
実際そこで学んだ概要を数回に分けてざっくりとですがまとめていこうと思います。
今回は、OOPが誕生するまでのプログラミング言語の歴史についてまとめます!
OOPの歴史を学ぶことが理解への近道
そもそもオブジェクト指向を生み出した先人の方々がどれだけすごいかも知らず、
私たちは普通にオブジェクト指向のプログラミング言語を使用しているかと思います。
でも、どこがすごくてなぜできたのか把握しないと有り難みがわかりませんよね。
この本ではオブジェクト指向ができるまでの歴史も説明してくれています。
ざっとですがOOPが出来るまでの流れは以下のような内容。
初期はプログラマ自身が機械語を書く時代
現代ではプログラミングを実行するのにまず、
私たちがソースコードを書いて、ビルドする際に機械語にコンパイルして実行します。
しかしプログラミング初期は、ソースコード自体存在せず、理解が難しい機械語で直接コードを書いていました。
※ビルドやコンパイル、ソースコードがわからない方はこちら
https://qiita.com/tomokichi_ruby/items/e1d52d3f34877389f905
A10010
機械語の例。全く何が書いてあるかわかりません。
アセンブリ言語の登場
機械語では難しすぎて理解できないので、人間にわかりやすいように記号に置き換えて書けるようにしたのがアセンブリ言語です!
記号に置き換えたと言っても、まだまだ書きやすいとは言えない状態です。
MOV AX,X
アセンブリ言語の例
機械語よりはましですがまだ理解はし辛いです
高級言語の登場
アセンブリ言語より、さらに人間が親しみやすい言語で書けるようにと考案されたのが、高級言語です!
数学の計算式と似たような形で書けるため、初心者でも理解しやすくなりました。
FORTRANやCOBOLがこれにあたります!
高級言語の登場で生産性がとても上がったのですが、それに負けじと社会のコンピュータへのニーズも大きくなります。
より生産性を上げる言語が求められます。
Z = X + Y
数式に近くなり解読しやすくなりました
構造化プログラミング理論の登場
より生産性を上げるため、様々な言語が考案された中で、より注目を集めたのが構造化プログラミング理論という考え方です。
今までの機能の中で、プログラムをわかり辛くしているものはむしろ無くしてしまおう!
という考えで、GOTO文を廃止し順次進行・条件分岐・繰り返しの3つを基本構造にしよう!というものでした。
条件分岐は今のif文、繰り返しはwhile文です!
さらにサブルーチン(関数)の独立性を高める動きも
サブルーチンとは、関数のことです。
共通の処理をひとまとめにして管理することですね。
初期から関数は存在していました。
しかし関数で使用する変数は、どこでも使用できるグローバル変数しかありませんでした。
そのため保守性が低く、変数の値が不正だと発覚した際にどこを調べたら良いかわからないというデメリットがありました。
そこでサブルーチンそれぞれの独立性を高めるために、ローカル変数が生み出されたのです!
※グローバル変数やローカル変数がわからない方はこちら
https://qiita.com/tomokichi_ruby/items/a2548176d85457f622a4
構造化言語の登場
"構造化プログラミング理論"と"サブルーチンの独立性"を取り入れた言語として、構造化言語が登場します。
代表的なものだとC言語がこれにあたります。
if文やcase文while文やfor文などの命令を使用して、明確な制御構造の記述が出来るようになりました!
しかしここまで来ても、社会のニーズには追いつかず、より改良が必要となります。
今までは、いかにわかりやすく生産性を上げるかが重視されてきましたが、
これからはいかに保守性を上げるかに着目して改良していく必要が出てきました。
なぜならプログラム自体の寿命が、当初の想定を遥かに上回っていたからです。
そして問題視されたのがグローバル変数と再利用性の貧弱さでした。
保守性を上げるための問題
①グローバル変数
すでにグローバル変数の保守性の低さ対策として、ローカル変数は考案されていました。
しかしサブルーチンの呼び出しが終わるとローカル変数は消えてしまうデメリットがあり、
サブルーチン内の変数を外でも使用したい場合はどうしてもまだまだグローバル変数に頼るしかなかったのです。
②貧弱な再利用性
構造化言語で再利用できるのは当時、サブルーチン(関数)のみでした。
サブルーチンだけでは再利用出来る範囲が狭すぎるので、より大きな再利用できる部品のような仕組みが必要でした。
これを改善したのがオブジェクト指向プログラミング(OOP)
上記の問題点を踏まえ、インスタンス変数やメソッド、クラスなどが考案され、より生産的に且つ保守性も向上した言語がOOPです!
オブジェクト指向のプログラミング言語を使用されている方はご存知の通り、
メソッドはもちろんクラスも共通の処理をまとめたものであり、より大きな枠で共通処理をまとめることが可能になっていますね。
またprivateメソッドやpublicメソッド等によりメソッドの適用範囲も自由に指定できることで、保守性も向上しています。
インスタンスやクラス、メソッドなどのオブジェクト指向の特徴についてはまた別途記事を作成する予定です。
さいごに
以上がOOPが生まれるまでのざっくりとした歴史の流れです。
改良が何回も重ねられ、今のOOPが生まれたことがお分かりいただけたかと思います。
グローバル変数しかなかった時代、それどころか機械語で直接コードを書いていた時代。
想像するだけで大変そうです。。
今でもプログラミングは難しく感じるけれど、先人の方々の知恵によりだいぶ楽させてもらってるんだなーということがわかりました!
ありがたいですね!
オブジェクト指向の特徴についてはまた別記事で掘り下げていこうと思います。
最後までご覧いただきありがとうございました