だいたいきままなエンジニア志望のブログ

エンジニア志望の大学院生の考えたことあれこれ

プログラミング言語の歴史から掴むオブジェクト指向の考え方

オブジェクト指向,なんとなく学んだことはあっても完全に理解できていなぁと感じていたので参考書をよみながらまとめてみました.
プログラミング言語の生い立ちとともにオブジェクト指向の考え方を追っていきます.

黎明期,機械語によるプログラミング

コンピュータは0,1の2進数で書かれた機械語しか解釈することはできません.したがって1940年代にはプログラマ機械語を使ってプログラミングをしていました.
たとえばこんな感じ.(16進数表現による機械語プログラム)

A10010
8B160210
01D0
A10410

まったくもって読めない...

アセンブリ言語

次に登場した言語がアセンブリ言語です.無機質な機械語を人間にわかりやすいよう記号に置き換えて表現することが特徴です.

MOV AX, X
MOV DX, Y
ADD AX, DX
MOV Z, AX

MOVとかADDとか命令っぽいものが確認できます.

高級言語

アセンブリ言語から更に進化し,人間により親しみやすい表現形式を追求して高級言語が発明されました.
FORTRANCOBOLがはじめに登場しました.
さきほどから例に上げているプログラムをFORTRANで書くと以下の通り,

Z = X+Y

我々プログラマには馴染みのある形になりましたね.
変数XとYの足し算の結果をZに格納するという,今までと比べると格段にわかりやすい形式になっています.

構造化プログラミング

「正しく動作するプログラムを作成するためにはわかりやすい構造にする事が重要」という考え方が構造化プログラミングです.
構造化プログラミングはロジックを以下の3つの構造だけで表現することを提唱しています.

  • 順次実行
  • 条件分岐
  • 繰り返し

f:id:arbol962:20190220175717p:plain
構造化プログラミングの三要素

  • 順番に処理は実行されるよ
  • 条件で処理を変えることができるよ
  • 条件のあいだ,処理を繰り返すことができるよ

おなじみの三要素ですね.

プログラミング言語は保守,再利用性重視に

時代が進み,ハードウェア性能が向上していくと従来に比べてプログラム自体のサイズ,実行速度の制約がゆるくなり,わかりやすいプログラムを記述することが重要視されるようになりました.

サブルーチンの独立性を高める

保守性を高めるにはサブルーチンの独立性を高めることが重要です.
理解のためにまず用語の定義

  • サブルーチン:プログラムに複数回現れる同じ命令を一箇所にまとめたもの
  • グローバル変数:複数のサブルーチンが編集できる変数

ここで,グローバル変数にエラーが出てしまうと修正するためにすべてのサブルーチンをチェックしなければなりません.
これってとても非効率ですよね.
メインの処理とサブルーチンの処理をできるだけ分離(グローバル変数を無くすこと)できれば,エラー箇所のみのチェックで済むわけです.
サブルーチンの独立性を高めるって大事ですね.

サブルーチンの独立性を高めるために考え出されたのがローカル変数値渡しです.

  • ローカル変数: サブルーチンの中でのみ使用できる変数.
  • 値渡し : サブルーチンにそこで使用する値(だけ)を渡すこと
グローバル変数問題と貧弱な再利用性(サブルーチン)

ローカル変数はサブルーチンが終わると存在自体が消滅してしまいます.したがってサブルーチンの前後で保持する必要がある情報はグローバル変数として保持するしか方法はありませんでした.グローバル変数はエラー修正のコストを高める厄介な存在ですが,従来の構造化言語ではこのグローバル変数問題を避けることは困難でした.
また,再利用できる共通部品として用意されているサブルーチンのみであり,大規模な共通部品として扱える仕組みは存在していませんでした.
これらの問題を解決するものこそオブジェクト指向なのです.


オブジェクト指向の特徴

これらを踏まえてオブジェクト指向の特徴を見ていきましょう.
ざっくり乱暴にまとめるとオブジェクト指向は以下の仕組みを持ちます

  • サブルーチン以外の再利用を可能にする仕組み


今までのプログラミング言語の問題点を解決するために編み出された考え方だということがよくわかります.
では改めてかの有名なオブジェクト指向の三大要素を見ていきましょう.

オブジェクト指向の三大要素

サブルーチンと変数をまとめて部品を作る.メインルーチン部分からは変数にアクセスできない
データや処理を外部から直接利用できなくすること.
外から触れることができなければプログラムが壊れる心配がない.プログラムが壊れにくくなるための機能

メソッドの呼び出し側を共通化する
クラスによって同一のメソッドで違う処理が行える
複数のメソッドを呼び出すロジックを一本化する.
逆に言うと異なるクラスのメソッドでも同じ名前で呼び出せる.

  • 継承

重複するクラス定義を共通化
同じ定義を二回目以降は書かなくていい.
継承によってクラスの共通部分の記述を省略,相違点だけ新たに記述すれば良い



プログラミングの歴史を感じる...(小並感
今回,利用した参考書はこちらです

オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向でなぜつくるのか 第2版