[つまづく] コンピュータの基礎ってなんだろう [潜ってみる]

常々「基礎をやれ」とえらそうに言うことを、人生の糧として生きているわけですが、ふと「コンピュータの基礎」って、なにをやれば「基礎」と言えるのか分からないことに気がつきました。

多分、大抵のエンジニアが思い描くものとして、コンピュータアーキテクチャ(またはシステム)は、ハードウェア、ソフトウェア、ネットワークで成り立っているから、それぞれについて基礎を学べば良いのではないかと想像するわけです。 なので、いったんはこのカテゴリで、基礎と言えるところまで深掘りしてみて、いったい何が基礎なのかを考えてみました。

なお、今日のネタは記憶だけで書いているので、たまにまちがいがあると思いますが、気にしないのが得策です。

1. ネットワーク

なんとなく単純そうだったので、ネットワークからいきます。 ネットワークの基礎ってなんだろうか。

現在のネットワークのベースは TCP/IPですので、それが基礎かと。ただ、TCP/IP は OSI7層でいったら 3,4層なので、相当上の部類です。OSI7層をネットワークの成り立ちとしてみるならば、全てのレイヤーを学ぶことが基礎と言えるでしょう。お、なんか簡単そうだ。

1-1. OSI7層

OSI7層についてあえて説明はしませんが「あぷせとねでふぃ」です。

上から順に

  • アプリケーション層
  • プレゼンテーション層
  • セッション層
  • トランスポート層
  • ネットワーク層
  • データリンク層
  • フィジカル(物理)層

となります。項番にしていないのは Markdown で降順にするやり方が不明だったからです。

各々に対して、基礎と言えるものを当てはめていけばいいのだろうか。 なんかでもやっかいだな。フィジカルは Ethernet ケーブルかと思ったら、光も同軸もあるし、無線だってここに位置する。 あれ、なんかもしかして基礎ってなんだろう。こうなってくると、OSI7層も放棄して、「どうしてネットワーク上でデータのやりとりができるの」が基礎なのだろうかと考える。

1-2. 通信の基礎

通信の基礎と言ったら、データを bit にして、8bit 単位で送信することや、パリティありなしとか同期・非同期によって、物理的な回線、または無線通信で 1対1 でデータの交換を行うことが基本。そのやりとりの規則をプロトコルと言うこと。この辺りだろうか。

さて、その bit はいったい何で送られているかというと、電気信号であり、光であれば光そのものになる。無線だと電波だ。 となってくると、電気工学的な話が必要になってくるんではなかろうか。 その電気についても、さらに深く見ていくと「電子」や「粒子」であり、電子工学の分野となるわけだ。ふむふむ。粒子の動きを見ようなんて無茶なことを考えると「量子力学」を学ぶ必要があるな。

おい。

とは言え、元々の電気信号がどうやって、メタル・光・空気中を流れて相手へ届くのかというのは必要不可欠な気がするので、電子工学→電気工学→情報工学的にレイヤーを上げていくのが通信の基礎ではないか。ふむふむ。やっかいだな。その後になって、初めて OSIのレイヤーが出てくるんだろうな。めんどうだ。

2. ソフトウェア

思ったより面倒だったので、すっかり簡単だろうと考えているソフトウェアに目を向ける。 ソフトウェアの基礎と言ったら、アセンブラ→マシン語だろう。こんなの当たり前だ。

本当か?

ソフトウェアはフォン・ノイマン型コンピュータによって、メモリ上にプログラムを配置して、順次実行をするというモデルができあがってからの産物である。しかも、元々はマシン語ですらなく、真空管交換型で電気信号をスイッチさせることによって、プログラムを演出していました。 となると、やはり「バグってなんで虫なの」の都市伝説まで戻ることも想定して、ソフトウェアの基礎はノイマン型コンピュータの基礎を学んだ上で、どうやってプログラムが作動するか、そこを理解する必要があるわけですな。 きっとそうだ。その上で、マシン語やアセンブラのありがたみを知る、これがエンジニアの正しい姿だ。

とすると、真空管やトランジスタがどのように動くかくらいはせめて知っておいた上で、プログラムの神髄を理解できるのではなかろうか。とすると電気工学だ。しかしまぁ、その電気はどのように流れているのか、いや、ソフトウェアはもっと上に位置する論理・理論的な工学な気がするので、そこまで深追いするのはやめよう。その辺はハードウェアやに任せたら良い。

とすると、プログラムはどのように動くか、と言うよりもどのように動かすべきかを学ぶ方が良いのではないだろうか。 やはり、言語云々はおいといて、アルゴリズムから入るしかなさそうだ。ソフトウェア工学を基礎として進むのが妥当ではないか。

そしてその上で、アセンブラあたりにしようか。いや、今時さすがにアルゴリズムを学ぶためにアセンブラはやり過ぎだな。やめよう。ソフトウェア屋はアルゴリズムを学んだら、それをコード化するために C言語を学ぼう。それが良い。こんな高級言語からいじれるなんて、ソフトウェア屋さんは羨ましいな。

3. ハードウェア

ハードこそ電子やろとか考えたけれども、その先をどうしようかって考えた。 流れ的には、ネットワークと同じで、電子工学→電気工学→情報工学とレイヤーを上げていけば良いだろうと考えたが、ネットワークと同じな結論に嫌気がさす。

おやと、考えたが結局、コンピュータのハードウェアも中を細かく分解していけば、ネットワークと同じようなものではないか。CPU もメモリもその中を電子が流れて動いているわけだ。あれ、とするとハードウェアとネットワークは同じ…( ゚д゚ )クワッ!!

そうか、情報工学のレイヤーまで上がってきたところで、進み方が変わるんだな。 ネットワークだと通信専門になるけれども、ハードウェアだと CPU/MEMORY/IO と箱物になっていく。その箱の中でなにが実現されているかを学ぶべきが基礎だろう。 さて、そのハードウェアである CPU/MEMORY/IO がどのように動作するのかという動作原理を学ぶにはどうすれば良いか、我々の時代は論理回路を実際に組んで CPUを作ってみたり、シミュレータで電気信号の流れる様を見て、どのような結果をもたらすのかを眺めてみたりとかしていた。しかしまぁ、世界が小さいので、4bit CPU から 64bit CPU など想像のしようが無い。さてどうするか。

ハードウェアを理解する上で一番役に立ったのはアセンブラだ。アセンブラ。マシン語でもいいが、せめてニーモニックくらい書かせてくれ、一応、人間なんだ。 アセンブラは直接 CPUの動作も、メモリへのアクセスも、I/O へのアクセスも事細かに指定しなければならない。そもそも、データを計算しようとした瞬間にメモリのことを忘れて、レジスタにデータを入れなきゃいけないとかのお作法を習うことで、実際にコンピュータの内部でなにがどうなっているかを理解することができるといえよう。I/O も指定されたポートにたいして、bit / byte データを投げて、その挙動を実際に見ることができる。TK80 でアセンブラやるのが一番だな、それだ。

ベースの流れとしては、電子工学→電気工学で電気工学の分野で一緒にアセンブラも学んで、機械類の制御も学べばハードウェアの挙動をおさえることも完璧だろう。おお。

4. まとめ

みっつにわけたものの、結局、どの分野でも電子・電気工学は学んでおいた方が良いことになるし、ハードウェアを学ぼうとしていたら、アセンブラかよ、それソフトウェアじゃねぇかみたいなことになることに気がついた。

従って、コンピュータの基礎と言ったら、次の4つをポイントして学べば良いと言うことが分かった。

  1. 電子工学
  2. 電気工学
  3. ソフトウェア工学
  4. 通信工学

今時、こんな奴いないわな。そりゃ、なんか上辺なエンジニアが増えたわけだ。

と言うおっさんのネタを思いついたので、誰かこの話を広げて収拾をつかなくして欲しいです。どうぞ。