20210427・28・29・30_アウトプット(オブジェクト指向でなぜ作るのか・イミテーションゲーム)
行ったこと
第4章まで理解(1670頁/5,000頁)
本の途中で出てきたイミテーションゲーム(映画)をアマプラで観た。
学んだこと
この本から学びたいことは何か?
オブジェクト指向の歴史(機械語から構造化プログラミングまで)
(1)機械語…2進数、コンピュータは今じゃ考えられないほど巨大❗️
🤔 私:1940年代、コンピュータは2進数の「機械語」から始まったんだよね?
🥸先生:そうだよ。当時は、スーパープログラマーだけが操れる時代で、コンピュータを作る前に建物を作らないといけない程、巨大だったんだ。
(2)アセンブリ言語…ちょっと分かりやすくなった記号での表現、コンパイル❗️
🤔 私:そこから、無機質な機械語を人間が分かりやすい記号に置き換えた「アセンブリ言語」が登場したんだよね?
🥸先生:そうそう。このアセンブリ言語こそが、プログラム言語の最初の一歩だったんだ。なぜならば、「コンパイル」をするからだよ。アセンブリ言語を使って書いたプログラムを機械語にコンパイルするために、アセンブラと呼ばれる別の機械に読み込ませて機械語を生成したんだ。しかし、アセンブリ言語は、命令を少し間違えるとプログラムは暴走してしまい、実行命令を一つ一つ指定するプログラミングは煩わしかったんだ。
(3)高級言語…英文に近い命令や構文規則で、人間が理解しやすい表現の言語に進歩❗️
😲私:一気に表現豊かになったね!
🥸先生:1954年頃数学の計算が大得意なFORTRAN(フォートラン)や、1959年に事務処理が得意なCOBOL(コボル)が登場したんだ。記述方法は一気に豊かになったものの、プログラムを書くときは1から全て書き上げる必要があったよ。
ここでのお話「ソフトウェア危機」
🤔 私:ソフトウェア危機とは?
🥸先生:1968年に、NATO主催のカンファレンスで「このままだと総人口がエンジニアになっても、コンピュータ需要に追いつかないぞー!」という危機宣言があったんだ。つまり、このまま一部のコンピュータにめちゃくちゃ詳しい人しか出来ないままだと、需要に全く追いつかないよ!という宣言で、高級言語が登場してもなお、コンピュータの開発をより便利にしたいというニーズは収まらなかったんだ。
(4)構造化プログラミング理論…順序進行、条件分岐、繰り返し(GOTOレス文)❗️
😲私:その危機に対応するため、構造化プログラミングが考案されたんだね。
🥸先生:1968年、計算機科学者エドガー・ダイクストラさんが、「処理の流れも構造的にして分かりやすくしよう!」と提唱したんだ。具体的には、どこでもジャンプできるGOTO文を廃止して、「順次進行」「条件分岐」「繰り返し」の3つの構造だけで表現しようと提唱したよ。
🥸先生:そうそう。話はそれるけど、グラフの最短距離を解くアルゴリズムで使う「ダイクストラ法」のダイクストラさんだね。始点から終点へ至る路のうち、間を通る辺のコストの総和がもっとも小さいものを求められることを考案した方だね。(ベルマンフォード法よりも計算時間が小さいが、負のコストが入っていると正しく答えが求められないので注意)
🥸先生:またこの辺りで言われたのが「サブルーチンの独立性を大事にしよう」という考え方だったんだ。それまではグローバル変数によってどこでも参照できてしまうためバグが起きた時にどこが引き金となっているのか分かりづらかったんだ。そこで「ローカル変数」と「引数」が生まれ、グローバル変数の使用を最小限にして、サブルーチンの独立性を高める技術が進歩したよ。
(5)ついに構造化言語の登場…構造化が言語にも適用❗️
😲私:構造化プログラミング理論の浸透に合わせて、「理論」だけでなく「言語」として、ALGOL(アルゴル)、Pascal(パスカル)、C(しー)言語が登場したんだね!
🥸先生:そうだね。特にC言語は、構造化プログラミングの機能を完全にサポートするだけでなく、従来はアセンブリ言語しかできなかったビット演算や、メモリ領域を効率的に使うためのポインタなどのきめ細かい機能を備えていたんだ。また全てを言語仕様にせずに、関数ライブラリを組み上げるようにしたよ。そのため、アプリケーション開発だけでなく、UNIX OSの言語として使用されるなど、システムプログラミングにまで幅広く使われたよ。
😲私:だから今でも「C言語が祖先なもの」が多いんだね!
この時点における欠点(課題)
🥸先生:はい!ここまで見てきたけれど、機械語から高級言語までの「人間に親しみやすい表現でソースコードを書けること」という流れと、構造化言語からの「出来上がったプログラムを理解しやすく、修正できるようにすること」の流れが今まであったんだね。
😲私:最初は「全て、一から書く」が当たり前だったけれど、「それじゃ追いつかないわ!」と再利用したり、バグの温床にしないソースコードの分かりやすさを模索し始めたんだね。
🥸先生:この時点における課題は「グローバル変数」(ローカル変数じゃ一時的すぎる、なんだかんだグローバル変数書かないと成り立たない)と「貧弱な再利用」(再利用できるのがサブルーチンのみ)だったんだよ。
😲私:そこで、出てきたのがオブジェクト指向プログラミングってわけだね!
オブジェクト指向プログラミングで出来ること(大きく3つ)
🥸先生:グローバル変数と、サブルーチンの課題を解決したのが、オブジェクト指向プログラミング(Object Oriented Programing)における「クラス」「ポリモーフィズム」「継承」という概念だったんだ!
😲私:「グローバル変数を使わない新たな方法」と「サブルーチン以外にも再利用できる仕組み」がOOPのお陰でできたんだね!
🥸先生:それぞれを見ていくよ。(OOPの仕組みは、言語ごとに微妙に異なる。以下は、Javaにおける考え方。)
「クラス」...まとめて隠してたくさん作る仕組み
(1)サブルーチンと変数を「まとめる」
(2)クラスの内部だけで使う変数やサブルーチンを「隠す」
(3)1つのクラスからインスタンスをたくさん「作る」
- クラスにおけるサブルーチンをメソッド、変数をインスタンス変数という。
- クラスのお陰で名前づけが楽になる。(クラスが別であれば、メソッド名やインスタンス変数名がかぶっていても大丈夫!)
private
とpublic
を指定することによって、グローバル変数を使わずにプログラムを書くことが可能になる。- 今までは、呼び出される変数側が、外からどれくらい呼び出されるか予測してその分のメモリを配列で確保しておかないといけない(その分ロジックが複雑)状況だった。
- しかし、クラスとそこから生まれるインスタンスという概念のおかげにより、呼び出される変数側は「どんな変数なのか」だけを定義して、呼び出す側が「インスタンス」として実行したときにメモリを確保するようになったので、複数同時に外から扱うことも可能になった!
- インスタンス変数は、影響範囲を局所化できるローカル変数と、存在期間が長いグローバル変数の良いとこ取りをした柔軟性のある素晴らしい子!!!
「ポリモーフィズム」
「共通メインルーチン」をつくる仕組み。
- 呼び出す側のロジックを一本化する仕組みだよ。
- コツが2つあるよ。それは、呼び出される側を整えること。①具体的には、メソッドの引数や戻り値の形式を統一すること。②ポリモーフィズムで呼び出される側に
extends
と宣言してもらうこと。 - そうすることによって、一本化した仕組みが実行された時に、宣言しているところに対して、共通化したメインルーチンを適用できるよ。
💡こんなふうに理解した💡(例え話:Uber eats)
- 呼び出される側をお店とする。Uberで運ぶには「出来立て鍋に入ったままの状態」「お皿に持った状態」「テイクアウト容器」など料理が完成したときの状態がバラバラだと、同じように運ぶことができないよね!
- なので、Uberで運ぶには「テイクアウト容器」に入れると統一する。(=メソッドの引数や戻り値の形式を統一する。)
- そして、Uberで運ぶには「私、登録店です!」と宣言していないと登録しているのかわからないよね!(=
extends
と宣言) - 上記らによって、呼び出される側を整えられたら準備OK!
- 呼び出す側の仕組みが「バイクで運ぶ」や「自転車で運ぶ」など、方法が変わっても「呼び出される側」に影響せずに、目的を達成することができる!この仕組みがポリモーフィズム。
「継承」...クラスの共通部分を別クラスにまとめる仕組み。
継承は、クラス定義の共通部分を別クラスにまとめて、コードの重複を排除する仕組み。
- さっきのポリモーフィズムでは飽き足らず、似たようなクラスはまとめてしまおう!という機能。
- 共通クラスのことをスーパークラスいい、それを利用するクラスをサブクラスをいう。
- 継承を使うには、ポリモーフィズムと同じように、呼び出される側を整えることと、宣言することができていればOK!
感想
- PHPとRubyなどプログラム言語の「そもそもの根本になる部分」を理解できてすごくスッキリした。今は言語の部分の章だけれども、抽象度ごとに「オブジェクト指向」を知ることができるので今後も楽しみ。(デザインパターンやモデリングなど)
- 理解に時間がかかるけど、大きい収穫なことには間違いない。
- これからPHPの学びを行うにあたっても、Rubyとの違いだけでなくオブジェクト指向型言語にあたり、全体のこのあたりをやっているのかと理解しながら進めることができるため視点が変わった。
- 一番嬉しかったのは、過去からの繋がり(オブジェクト指向以前では、実現できなかった欠点からのつながり)を自分の言葉で理解できたこと。本当にコンピュータの世界、難しいけれど「楽しい」と感じること尽きないなと思った。
- コンピュータ科学の栄誉「チューリング賞」の由来にもなっているアランチューリングさん人生を題材にした作品。本に出てきて「面白そう!」と思ったらプライム会員ならちょうど観れた!!!ラッキー😍
- すーごく面白かった!!!!!!久々の映画!!!!!!!!ストーリーの発展にワクワクしたし、改めてコンピュータって過去の天才たちが作り上げている結晶なんだと思って、感謝の気持ちでいっぱいになった。
- 同時に、過去の偉人って当時は天才すぎて周りが理解できず反発をくらったり、当時の価値観で法が決められておりそのせいで亡くなってしまったり、こんなに恩恵を受けているのに、当時はそれに対する感謝というか、賞賛がないまま亡くなっていることが多い。何十年も何百年も「天才」と名が残る人で、その人が生きている間は「苦しい」ことが多い。価値観ってなんだろう。複雑な気持ちになった。
- だからこそ、自分の価値観もただのサンプル数1なので、自分とは異なる視点の意見にも「なぜそのように思うんだろうか」と好奇心を持って聞く姿勢でありたいと感じた。
- より一層頑張る。本当にありがとうございます。