そもそも、私自身はじめはオブジェクト指向言語という言葉自体が抽象的でピンと来ませんでした。「なんか聞いたことはある」「JavascriptとかPythonとかもそうらしい。知らんけど」程度です。そんな中、「オブジェクト指向言語でなぜつくるのか」を読んだので、印象に残った箇所をまとめます。
オブジェクト指向とは
ざっくりいうと、「ソフトウェア開発を楽にするための総合的な技術」です。オブジェクト指向はプログラミング技術として発案されましたが、現在では、汎用の整理術として要求仕様や設計内容の図式表現にも用いられているため「総合的な技術」となっています。
オブジェクト指向が用いられている技術として、プログラミング言語に絞るとC++、Java, Javascript, Python, Rubyなどが挙げられます。現在用いられているほとんどの言語がオブジェクト指向なんですね。
オブジェクト指向言語の歴史
現在非常に多く用いられているオブジェクト指向言語(以下、OOP(Object Oriented Programming))ですが、この技術が誕生した背景に注目すると、より理解が深まります。
機械語が用いられていた黎明期
そもそもコンピューターは2進数で書かれた機械語しか理解できません。このため、プログラムを用意する時、最終的に機械語で書かれた命令群を用意しなければなりません。
現在では、JavaやPythonなどのプログラミング言語があるため、プログラマーが機械語を意識する必要はありません。しかし、コンピューターが発明された1940年代にはそのようなものはなく、プログラマーが一文字一文字手入力で記述する必要がありました。
A10010
8B160210
01D0
A10410
ちんぷんかんぷんですね。。。
もうちょっと進みましょう。
機械語から進化したアセンブリ言語
次に登場したアセンブリ言語では、無機質な機械語をより人間にわかりやすい記号で記述できるようになりました。
MOV AX, X
MOV DX, Y
ADD AX, DX
MOV Z, AX
人間にわかりやすいといっても、この状態でもほぼ何をしているかわかりません。。。
ただ、MOV
で何かを動かしていて、ADD
で何かを追加していることはぼんやり想像できるような気がしないでもないです(ほぼわからん)。
高級言語の発明
次に高級言語が登場しました。高級言語ではコンピューターが理解する言語を一つ一つ記述するのではなく、より人間にわかりやすいように「高級な」形式で表現します。また、ここからサブルーチン(メソッド)も利用できるようになりました。
z = x + y
だいぶわかりやすくなりましたね。実はこれまでの意味不明のプログラム例はこの記述を表現するものだったんです。これまでに用いられていた、機械語やアセンブリ言語と比較して高級言語が便利であることは明らかです。
しかし、1960年代当時、この進化では追いつかないほどにソフトウェア需要は増大しており、NATO(北大西洋条約機構)の国際会議では「20世紀末には全人口がプログラマーになってもソフトウェア需要をカバーしきれない」として、「ソフトウェア危機」を発表しました。
構造化プログラミング言語
そんな「ソフトウェア危機」に対応するべく、登場したのが構造化プログラミング言語です。代表的なものとしてC言語, ALGOL, Pascalなどがあります。
構造化プログラミング言語では、「わかりやすい構造」が重視され、プログラムのロジックが「順次進行」「条件分岐(if文, case文, while文)」「繰り返し (for文)」の3つの構造で表現されています。今では当たり前のように感じますが、それまで主流だったCOBOLやFORTMANでは基本三構造を素直に書けなかったため、こうした言語の登場は大きな進化でした。
構造化プログラミング言語の弱点
しかし、構造化プログラミング言語にも弱点がありました。その一つが貧弱な再利用です。この時代では、構造化プログラミング言語で再利用できるのは「メソッド」のみであり、コード変換や入出力処理、数値計算などの基本的な処理についてのものしかありませんでした。このため、当時増大するアプリケーションの規模に対して、機能の再利用性が不足していました。
オブジェクト指向言語の登場
そんな中登場したのが、「クラス(カプセル化)」「ポリモーフィズム」「継承」 の三大要素を備えたオブジェクト指向言語でした。これらの要素をもう少しくだけた表現に直すと「重複した無駄なロジックを排除し、必要な機能を整理整頓する仕組み」です。こうした機能には強力な再利用性があり、構造化プログラミング言語の課題を全てカバーするものでした。三大要素についてはこちらで詳細に説明されています。