
コンピューターの進化の歴史から読み解く。プログラムとは翻訳だらけ (1): プログラム登場から高級プログラム言語まで
『愚者は経験に学び、賢者は歴史に学ぶ』
https://tetsu-tama.com/%e3%83%93%e3%82%b9%e3%83%9e%e3%83%ab%e3%82%af%e3%81%ae%e6%a0%bc%e8%a8%80%e3%80%8c%e6%84%9a%e8%80%85%e3%81%af%e7%b5%8c%e9%a8%93%e3%81%ab%e5%ad%a6%e3%81%b3%e3%80%81%e8%b3%a2%e8%80%85%e3%81%af%e6%ad%b4/
厳密にはそのままのコメントでは無いようですね。そしてこの1文だけを切り取るのは意図が伝わらなくなっちゃうので、良くないんですが。
でも、この1文だけでも納得感が高いです。
ここでは、コンピューターの進化の歴史を紐解いての私なりの学びを纏めていきます。
技術は必ず積み上げで出来ています。例えば、Pythonのパッケージを pip で matplotlib だけをインポートしようとしています。でも、依存パッケージと呼ばれている matplotlib が使っている他のパッケージも大量に取り込みますよね😊 積み上げだからです。
つまり、過去を知る事で、なぜこれが使われているのか? が理解でき、その使い方が見えてきます。
単一のコンピューターの構成を歴史を紐解いていきましょう!
詳細は書籍や Wikipedia などで。ここでは、技術の積み上げについての部分だけ取り上げます。
コンピュータ - Wikipedia
プログラムの登場 - ENIAC

ENIAC が最初のコンピューターと言われています。
ENIAC の革新的だったことは、プログラムを組むと、従来型の計算機が1,200秒つまり20分かかっていた計算を 3秒で終わらせた事です! 400倍も高速にしたんです!
ところが、そのプログラムを組む事が課題でした。写真を見ていたければ想像がつくでしょうが、プログラムを組む = ケーブルの配管を行う、という作業だったんです。これは時間もかかりますし、間違いもありますよね。なにせ全体を見るのが難しいわけで。
そうなんです。今の私たちだったら、更にその先の答えの一つがわかっています。なので、「なんで配管にしたんだよー」と言えますよね。でも、当時、ENIACを開発した人達は当時のエリート・優秀な方々だったと思います。何せ世界初ですからね。その人達でも、目の前の課題を解く事に精一杯だったのかもしれませんね。
機械語の登場 - EDVAC

CPU を動かすために機械語が出来たんですね。

機械語とは、CPU への直接の命令です。電源のオンとオフを 0 と 1 に置き換えて (符号化) 表現をしました。0と1ですから、2進数ですね。私たちが普段使っているのは 10進数ですよね。0から9までいって、次に位が増えます。
ちょっとハイライトしますね。

この数字の列挙。見てもさっぱりわかりませんよね😅 はい、私にもわかりません。
これがどういう意味かと言えば、下記の通り。

97 は、2進数で 「1100001」になります。私も一発で分からないので、ツールで変換しました。
何と Windows の最新の電卓だと、プログラマー という種類の電卓があるんです。

で、DEC (decimalの事ですね) を選択して数字を入力すれば、下図のように一発で2進数の数字に変換してくれます! 便利な時代になったものです。

さて、戻りましょう。
つまり、この機械語の、右側が 97 というデータになりますね。で、左側で、
- AL というレジスタ
- 格納してね
を指定しているんです。

わかるんかい! と思っちゃいますが、機械語のプログラマーの方は、これをずっと入力しているわけで。わかるんですねぇー。凄いですよねー
問題点
はい、雰囲気でお分かりかと思いますが、2進数だけでプログラムを組むのは、相当な専門の人でないと理解が出来ません。つまり、何か問題があっても、プログラマーレベルの知識が無いと会話にすら入れません。人の育成コストが高くて…
アセンブラ - プログラム言語の登場

機械語の問題を解決するために、その符号化。つまり、対応表みたいなものを定義しようという事になったんですね。ニーモニック言語とも呼ばれます。翻訳ですよね😊
アセンブラが開発されます。

実は、コンピューターってずっと変換の世界で。最後にはCPUに電源のオンとオフの順番を指示したいわけですよ。それを人がわかるように変換を重ねる。CPUと人とのコミュニケーションなので「言語」という言葉が使われだすわけですよね。言葉の定義をした人は凄いですよね。
さて、ここでもハイライトしましょう。

先ほどの機械語と同じ "ALレジスタに 97を格納する" という命令を、開発されたニーモニック言語であるアセンブラで書くと、このように記述するんですね。
MOV は Move から来てますよね。
AL は ALレジスタ
61 は HEX つまり 16進数で、10進数の97を意味します。
参考までに、先ほどの Windows のプログラム用電卓の画面を。

だいぶわかりやすくなりましたよね!
私たちが普段話している言葉の一つである英語に近いので、英語がわかれば、意味もわかるし、記述しやすくなりますよね。
問題点
CPUが異なるとアセンブラの記述方法も変わります。実はCPUの種類も CISCとかRISCとか種類も複数あります。また、同じ RISC でも コンピューターメーカーが異なれば、アセンブラも異なります。
高級プログラム言語 - FORTRAN の登場

CPUの違いを超えるため、アセンブラの更に上位にプログラム言語が登場しました。

これによって、CPU に依存する事無く。つまり、特定ベンダーになるべく依存しない形でプログラムの記述が出来るようになりました。
これでもまだプログラミングの作業は大変だったんですね。
問題点
CPU以外も幾つかのハードウェアがあり、それらの直接の操作のために多くの記述が必要だったんですね。ファイルという概念はあったとしても、それを保存するために、テープ装置なのか、ディスクなのか、などなど…
今回のまとめ
ENIACの登場から 8年くらいです。ここまで見てきて思いませんか?
良く考えたら、問題点はわかるんじゃないの?
そうじゃなかったんです。
歴史がそれを饒舌に語ってくれますよね😊
そしてもう一つ。CPUを操作するためのプログラムの記述をした後の翻訳の層・レイヤーが増えていますよね。コンピューターは早く動いた方がいいわけです。ですが、早さを多少犠牲にしてでも得たい別のコトが出てくるわけです。そうなんです。最高のパフォーマンスのプログラムを書きたかったら、今でも機械語を書けばいいんですよ。
今、世の中で機械語のプログラマーは稀だと思います。私も書いた経験が無いです。
プログラムを書くという行為は、CPU に対してタスクの指示をしている事と言えるかと思います。CPUを深く知らないと書けなかったプログラムが、だんだん人が理解しやすい形に進化してきたわけです。この流れは今も止まっていません。もっと使いやすくなるはず。
これも、歴史が語ってくれますよね。
