コンピュータの仕組みを完全に理解するための最強ロードマップを東大卒エンジニアが解説
はじめに
どうも、私立YouTube高専校長です。 あなたは、「十分に発達した科学技術は、魔法と見分けがつかない」という言葉をご存知でしょうか。 現代人のあなたは、パソコンやスマートフォンなど、多くのコンピュータに囲まれて生活をしているので、コンピュータを見ても何とも思わないでしょう。 しかし、昔の人がみたら、十分に魔法と呼ぶに足る、驚異の科学技術です。 しかし、実は現代人のあなたも、その仕組みをあまり理解していないのではないでしょうか? 実際、仕組みを理解しても、こんな事可能なんだと、魔法じゃんと思うくらい、コンピュータの仕組みはすごいです。 そこで、本日は、コンピュータの仕組みを完全に理解するためのロードマップをご紹介したいと思います。
プログラミングや環境構築をしていて、本やブログ通りなのに、意味不明なエラーが発生したという経験はないでしょうか? もしかしたら、そのような時、ネットにあるよく分からないコマンドやソースコードをコピペしてきて、なぜか分からないが解決したのではないでしょうか。 私も重要でなければ、そのように適当に解決する時もありますが、このような事を続けていると、その解決法は正しくない可能性があるので、後にもっと大きな不具合として表れてくる可能性があります。
しかし、コンピュータの仕組みを理解していれば、いくらでも原理を遡って、問題の根本原因を特定する事も出来ます。
世の中には、コンピュータで動かすアプリケーションが、ブラウザだとか、エクセルだとか、AIだとか沢山あります。 しかし、コンピュータの仕組み自体は、全てのアプリケーションに共通しているので、その分だけ勉強する価値は高いです。 逆に言うと、コンピュータの仕組みさえ知っていれば、アプリケーションは必要なときに、その分野を集中的に勉強すれば、すぐにキャッチアップすることができます。
一方で、コンピュータはハードウェアを抽象化しているので、ブラックボックスとして使えるという考え方もありますが、これは、完全な建前で、実際には、コンピュータの仕組みを知らずにソフトウェア開発をすると、環境構築がうまくいかなかったり、不具合の原因が特定できなかったり、また、パフォーマンスの点で、ハードウェアの力を100%発揮できないという事態に陥ってしまいます。
実際に、ChatGPTのような最新のAIのようなアプリケーションでも、コンピュータの仕組みを何も考えずにやみくもに学習を行うソフトウェアを開発しているのではなく、適切にGPUを使うことによって、初めて大規模な学習が可能になり、今まででは信じられなかったような精度の対話システムが、現実的な計算時間で可能となりました。
このように、コンピュータの仕組みを理解し、ハードウェアの力を100%引き出すことで初めて、新しい技術が生まれたのです。
かといって、コンピュータは非常に複雑なシステムなので、そもそも何を学習したらいいのか、分からないという方もいらっしゃると思います。
私自身、高専に入って、15歳からコンピュータの勉強を始めましたが、正直言って、高専で5年間勉強して、卒業した時点でも、目の前のコンピュータがどういう仕組みで動いているのか、よく分かりませんでした。個々の部品の仕組みだけを理解しても、全体の仕組みは理解できません。私にとっては、まだ、魔法の箱でした。実際に、コンピュータの仕組みを理解して、その魔法が解けたのは、外資系のハイテク企業でSoCの下回りのプログラムをハードウェアを意識して、書くという経験をしてからでした。
そこで、本日はこのような経験から、コンピュータの仕組みを完全に理解するためのロードマップをご紹介したいと思います。
また今回紹介する情報以外にも、こういった有益なコンピュータ関連の技術情報を発信しているので、 そういった動画を見逃したくない方は、今のうちにチャンネル登録しておいて貰えればと思います。
それでは、本編どうぞ
具体と抽象
まず、具体的なロードマップについてご紹介する前に、コンピュータの仕組みを勉強する上での重要な概念をご紹介しておきます。 それは、具体と抽象というものです。この概念を理解していないと、コンピュータのような複雑なシステムを理解するのが非常に難しくなります。
コンピュータは、全体のシステムを機能ごとにモジュール化して、モジュール間のインターフェースを定義する事によって設計されています。こうすることで、他のモジュールの具体的な実装を抽象化して考えることができます。 なので、モジュールを入れ替えても使えるので、互換性や再利用性が上がり、開発を効率化することができます。そして、重要なのは、抽象化することによって、複雑なシステムも、人間のような余り賢くない頭でも理解できるようになります。
逆に、実装がモジュール化されておらず、モノリス(一枚岩)の実装だと、一つのシステムに全ての仕様が入ることになるので、非常に複雑になります。このような複雑なものは、人間には理解できません。
例えば、あなたがコンピューターの上でアプリケーションを開発して動かす時には、CPUや使用しているモニターの細かい仕様を理解する必要は、ありません。これは、コンパイラやOSがハードウェアの違いを吸収してくれているので、意識する必要がないのです。 というよりも、そうなるように開発者がコンピューターを設計してくれているのです。
この後の説明でも、具体と抽象というキーワードは何回も出てくるので、状況に応じて、今はどの抽象レベルで話をしているのか、考えながら聞いてみてください。何を抽象化して考えていて、何がどれの具体なのか、それを意識すると、コンピュータのような複雑なシステムを理解できるようになります。
それでは、具体的に、コンピュータの動きを理解するためのロードマップをご紹介していきたいと思います。 コンピュータを理解する上での、キーワードは動画内で、全て説明するので、気になった内容は、自分に合った本を探して、勉強してみてください。
ハードウェアとソフトウェア
まず、大前提からお話しますと、コンピュータというのは、ハードウェアとソフトウェアが巧みに融合することで、1つのシステムとして成立しています。 ハードウェアとは、CPUやメモリやストレージなどの、物理的に存在するものです。あなたのスマホやPCを開けると、中に基板があると思います。それが、ハードウェアです。 一方で、ソフトウェアとはハードウェアを制御するための、情報(命令やデータ)です。一般的に、HDDやSSDなどのストレージにバイナリやスクリプトとして格納されています。
最新の、AIシステムでも、この構造は、まったく変わりません。必ず、ソフトウェアとハードウェアの両方が必要です。
コンピューターの仕組みを理解するためには、ハードウェアとソフトウェア、さらにそれらがどのように連携しているのか理解する必要があります。 まずは、ハードウェアを理解するためのロードマップからご紹介したいと思います!
ハードウェア編
ブール代数・デジタル回路
この動画をご覧の方は、プログラミング経験のある方がほとんどだと思います。しかし、そもそもなぜ、コンピュータで計算ができるのか、不思議ではないでしょうか。
これは、魔法ではありません。中に魔法使いがいるわけではないのです。 ブール代数とデジタル回路を学習すると、それが理解できるようになります。 デジタル回路では、0と1という2値の電圧に対して、ANDゲートやORゲートやNOTゲートなどの論理ゲートを使って、加算器や減算器というものを構成します。ブール代数は、それをより抽象化して、純粋な数学として整理したものです。
また、デジタル回路は、計算だけでなく、データの保持にも使えます。フリップフロップ回路やラッチ回路と呼ばれる回路で0と1を表現することができ、これは、SRAM(Static Random Access Memory)と呼ばれる記憶素子の仕組みそのものです。
なので、デジタル回路を勉強すると、計算やデータの保持を行う仕組みが理解できるようになります。これは、自分が勉強してきた中でも、かなり衝撃的な瞬間で、自分が、初めてこれを勉強した時は、感動して、非常に積極的に勉強した記憶があります。
実際にドライバーやOSなどの下回りのプログラムを書いていると、このデジタル回路のハード的な不具合に出くわすことがあります。
このような不具合は、erattaと呼ばれます。ハードの不具合は、後から直せないので、非常に致命的な不具合にも思われますが、ソフトウェアは後からいくらでも変更できるので、ソフトウェアで回避できる場合は、ソフトウェアによって回避されます。これは、ソフトウェアの強みが最大限活かされる場面になります。
しかしこの種の不具合は、ソフトウェアだけを見ていてもわからないので、見つけるのが困難な上に、目には見えないセキュリティホールになっていて、たまにニュースになっていることもあります。
デジタル回路を勉強すると、論理ゲートを使うと、計算やデータの保持できそうだというのは、理解できると思います。 しかし、そんな都合のいい論理ゲートなんてものが本当に存在するのか?ということが次は気になると思います。 そこで次は、その疑問を解決するための、ロードマップをご紹介したいと思います!
半導体
デジタル回路を学習している段階では、論理ゲートは論理的な演算子として、抽象化されていますが、このゲートの正体は、現代のコンピュータにおいては、トランジスタという半導体で作られたスイッチです。
今や、最先端のSoCでは、指先サイズのSoCに数億個のトランジスタが収まっています。 CPUもDRAMもSSDも、USBコントローラーもWi-Fiチップも、コンピュータの中身は半導体だらけです。
したがって、コンピューターの仕組みを理解するうえで、半導体の理解は必須です。しかし、真面目に半導体を勉強しようとすると、実は、非常に学習コストが高いです。 なぜなら、半導体の振る舞いというのは、古典力学の枠を超えて、量子力学の分野になるからです。それだけでなく、電磁気学や熱力学や統計力学も勉強した上で、ようやく物性物理学という半導体の物性を扱う学問を学ぶ準備ができます。もし、将来コンピュータの中でも、半導体に興味があって半導体関連のハードウェアエンジニアになりたいとしたら、沢山の勉強が必要になる事を覚悟しておいてください。しかし、面白さと感動は保証します。人類とは、よく、ここまで来たもんだと関心させられます。ビジネス的にも、政治的にも、技術的にもめちゃくちゃ熱い分野になるので、是非勉強してみてください。
また、実は、歴史的には、半導体以外にも、真空管やリレーなども、スイッチング素子として使われていました。 しかし、半導体(具体的には、シリコン)というのは、地殻に2番目に多い元素で、採取コストが低く、トランジスタを製造するための微細加工もし易く、常温常圧で半導体として優れた物性を示す奇跡の物質です。性能も製造上も、圧倒的に優れているので、今やスイッチング素子に、半導体を選ばない理由はありません。 シリコンがなければ、コンピュータ技術はこれほど、発達しなかっただろうし、一人一台スマートフォンを持てるほど、安くもならなかったでしょう。
半導体技術の進化なくして、コンピュータの技術は進化しません。そのため、多くの国や会社が莫大な投資をしてきて、今の優れたAI技術や、Web技術が実現したのです。半導体技術がコンピュータ技術のコアと言えます。興味があったら、ぜひ詳しく勉強してみてください。
ここまで勉強すれば、コンピュータが半導体によって作られたデジタル回路で動いていることが分かると思います。 では、デジタル回路を、コンピュータで具体的にどうやって使っているんだろう?というのが次は、気になると思います。 そこで次は、その疑問を解決するための、ロードマップをご紹介したいと思います!
コンピュータアーキテクチャ
デジタル回路や半導体を学習したら、半導体を使って、計算やデータの保持ができそうだというのは、理解できると思います。 しかし、それを使ってどうやってコンピュータは作られているのか?それに答えるのがコンピュータアーキテクチャという分野です。 コンピューターアーキテクチャという分野では、コンピューターにどのような部品が必要なのか、そしてそれらがどのように連携しているのかを学ぶことができます。 部品としては、プロセッサー、メモリ、ストレージ、キャッシュ、MMU、DMA、割り込みコントローラーなど、デジタル回路で作られたモジュールがあり、それらはバスと呼ばれる通信経路でコミュニケーションを取って、連携しています。これらは、100%デジタル回路でできています。
大抵のコンピュータアーキテクチャの本には、アーキテクチャの一般論が書かれていますが、実際には、コンピュータアーキテクチャというのは、製品ごとに異なります。したがって、その上で動くソフトウェアが、ハードウェアのパフォーマンスを出し切るためには、ハードウェアのアーキテクチャに対して、最適化されている必要があります。 例えば、ハードウェアとしてGPUがあるのに、GPUを使わないソフトウェアはもったいないです。
しかし、一般的に、OSの上でアプリケーションを開発する上では、OSが既にハードウェアに対して最適化されていれば、そこまで敏感になる必要はありません。ただし、OSやドライバ開発では、必ずアーキテクチャを意識して、ソフトウェアを実装する必要があります。製品ごとの詳細なアーキテクチャは、本や教科書ではなく、チップのマニュアルに記載されています。
ここまで勉強すれば、コンピュータのハード的な仕組みは大体理解出来ると思います。 しかし、これらを勉強しても、本を読むだけになって、手を動かしながら学ぶことが難しいので、理解したと感じれないでしょう。 そこで次は、より理解を深めるためのロードマップをご紹介したいと思います!
FPGA
FPGA(field-programmable gate array)というものを使うと、なんとデジダル回路をソフトウェアによって、プログラミングできます。 これは、マイコンとは全く異なるもので、学習目的ではなく、製品開発にも使われることがあります。 FPGAを使って、CPUを実装するような本は結構沢山出ているので、それらの本で勉強すると、手を動かしながら、これまで説明してきたデジタル回路やコンピュータアーキテクチャの勉強ができるので、FPGAを使って学習することで、コンピューターのハードウェアに関する理解が非常に深まります。
難しいと思いますが、楽しいので是非挑戦してみてください。
ここまで勉強すれば、コンピュータのハード的な仕組みは完全に理解出来ます。 しかし、ハードウェアだけでは、コンピュータは動きません。ソフトウェアが必要です。 そこで次は、ソフトウェアの仕組みを理解するためのロードマップをご紹介したいと思います!
ソフトウェア編
コンピュータはソフトウェアを切り替えることで、全く違う目的のマシンに変わります。 あるときは、ブラウザとして、あるときは音楽プレーヤーとして、あるときは、対話型AIとして、あるときはゲーム機として動きます。このソフトウェアによる柔軟性が、コンピュータのすごい所です。
プログラミング
まずは、手っ取り早くソフトウェアを学習する方法として、プログラミングを勉強しましょう。 ただし、コンピュータの仕組みを勉強するのが目的なので、C言語を選んでください。 最低限、関数、ポインタの使い方は理解しておきましょう。 単純に、アルゴリズムやデータ構造の勉強だけがしたいなら、Pythonもいいですが、 Pythonは色々抽象化し過ぎているので、コンピュータの仕組みを勉強するには、不向きです。
C言語で、一般的なアルゴリズムやデータ構造を学習すれば、プログラミングがどんなもんかが分かってくると思います。 しかし、自分で作ったプログラムがどのような仕組みでハードウェアによって実行されているのか、まだ全然理解できないと思います。 そこで次は、その疑問を解決するための、ロードマップをご紹介したいと思います!
コンパイラ・リンカ・ローダ
C言語では、ソースコードをコンパイルして、実行ファイルを作って、それを実行します。 なぜそんな周りくどいことをするのでしょうか?それには、ちゃんと理由があります。
それは、ソースコードは人間には読みやすいんですが、ハードウェアは直接理解できないからです。 実はハードウェアが直接実行できる命令というのはあまり融通がききません。 直接実行できる命令というのは、データのコピーや四則演算のような、非常に単純な命令だけです。
かといって、プログラマーは直接実行ファイルを書くわけにもいきません。 実行ファイルは0と1の羅列である、バイナリなのでとても人間には理解できる代物ではないので、 人間は、人間にも理解できるソースコードを書いて、コンパイラーと呼ばれるソフトウェアによって、ハードウェアが直接実行できる実行ファイルに変換しているのです。
この辺の仕組みを詳細に理解するためには、コンパイラだけでなく、リンカやローダーの仕組みも勉強する必要があります。
リンカは複数の実行ファイルを1つの実行ファイルに結合するためのソフトウェアです。あなたがコンパイラを呼ぶときに、後ろで見えないところで呼ばれています。 そして、ユーザーが実行ファイルを実行するとき、ローダーと呼ばれるソフトウェアが、実行ファイルをメモリに展開して、CPUがエントリーポイントから実行を始めるよう、手続きを行ってくれます。これによって、あなたが書いたプログラムが、ハードウェアによって実行されるのです。
ここまで勉強すると、自分が書いたプログラムがどのような仕組みでハードウェアによって実行されていいるのかは、理解できるようになると思います。 しかし、コンピュータでは、自分が書いたプログラムだけでなく、他のプログラム(ブラウザやエクセルなど)も同時に動いています。さらに、画面も順次更新されて、キーボード入力もいつでも応答してくれます。 ハードウェア的には、CPUもメモリも1つしかないはずなのに、なぜこんなことが可能なんでしょうか? そこで次は、その疑問を解決するための、ロードマップをご紹介したいと思います!
OS
コンピュータでは、ただ1つのプログラムが動いているのではなく、ブラウザとワードは同時に動いているし、キーボードやモニターも同時に使えます。 しかし、ハードウェア的には、CPUもメモリも1つしかありません。 この謎を解くのが、OS(Operating System)です。
OSは、ハードウェアを管理するためソフトウェアで、自分が書くプログラムとは一段メタ的に動いています。メタ的というのは、高次的という意味です。
OSは、CPU、メモリ、周辺機器等を管理して、仮想メモリ、プロセス、スケジューリング、ドライバー、ファイルシステム、キャッシュ管理等々、アプリケーションの前提となるような機能を実現しています。 例えば、あなたが、当たり前のように、データをファイルとして扱えるのは、ファイルシステムがあってのことです。ストレージ上では、ファイルというのはただのバイナリのデータに過ぎません。しかし、ファイルシステムがバイナリに解釈を与えてくれるのです。
また、あなたのプログラムを実行している時も、ブラウザやワードも同時に使えます。そして、バックグラウンドで動いているプロセスも止まりません。これは、OSがCPUやメモリを管理し、一定時間ごとに、プロセスを切り替えて、CPUに仕事を割り当てているためです。
そのため、実はあなたのプログラムは途中で、OSによって一時停止させられたり、再開させられたりしているのです。
OSの知識は、特にサーバー管理している場合や、環境構築をする時には必須の知識です。意味もわからずにコマンドを打っていると、環境を破壊する可能性があります。 OSは物理世界であるハードウェアと情報世界であるソフトウェアをつなぐ架け橋です。そのため、OSの勉強は、ハードウェアの勉強にも、ソフトウェアの勉強にもなるので、是非挑戦してみてください。
まとめ
ここまで、勉強したら、ハードウェアからソフトウェアまで、コンピュータがどういう仕組みで動いているのか理解できるようになると思います。 もしかしたら、コンピュータを勉強中の方は、今日の話を聞いて、こう思ったかもしれません。 「ハードもソフトも勉強しないと、コンピュータの仕組みが理解できないなんて、難しすぎるよ。。」と。
たしかに、コンピュータの仕組みを理解するのは難しいです。それを、使いこなすことはもっと難しいです。 しかし、逆に言うと、プログラムを書くだけなら、誰にでも、今やChatGPTにですら、できます。 プログラムを書けることももちろん重要ですが、それ以上に意図しない挙動を示したときに、それを解決できるかどうか、 あるいは、そのプログラムの仕組みを理解して、課題を提案・解決かどうかが大事なんです。 コンピュータの仕組みを理解していれば、原理まで遡って、課題を提案・解決出来るようになります。 そうすると、コンピュータの仕組みをろくに理解せずに、ChatGPTからコピペして、バグがあったら、投げ出してしまうようなエンジニアとは一線を画す存在になります。
**その分学習コストも高いですが、安心してください。**私のチャンネルでは、コンピュータを使いこなすために必要な、コンピュータ関連の技術を原理から分かりやすく解説します。 この動画を見ているあなたは、コンピュータを使いこなせるようになるかと、不安になる必要はまったくありません。
なぜかというと、こんなコンピュータの仕組みを理解するための動画を、30分も聞ける、あなたはポテンシャルの塊なんです。 自信を持って好奇心のままに勉強してください。自信を無くして、投げ出してしまう人が殆どです。 5年後には、天地の差が開いています。
もし、なにかまだ分からないみたいな点があったら、ぜひコメントで教えてください。
自分もまだまだ知らないことはあるので、一緒に勉強していきましょう。 私が高専・東大・スタートアップ・日系大手メーカー・外資ハイテク企業と、、、人生の大半をコンピュータに投下して、学んできた全てをこのチャンネルにぶつけるので、私の動画を見ることによって、他では得られないコンピュータの原理的な考え方が身に付きます。
絶対にできます!一緒に頑張りましょう! 最後に復習をして、本日の動画を終わりにしたいと思います。
復習
本日は、コンピュータの仕組みを完全に理解するためのロードマップというのをテーマにお話をしました。 最初に、コンピュータの仕組みを理解する上で重要な概念として、具体と抽象というものをご紹介しました。動画の中で何回も"具体的"や"抽象"という言葉を使っていたのに、お気づき頂けたでしょうか。この概念は複雑なシステムの理解を可能にするので、是非覚えておいて下さい。
そして次に、コンピューターの仕組みを理解するためには、ハードウェアとソフトウェア、さらにそれらがどのように連携しているのか理解する必要があるというお話をしました。 ハードウェアの勉強としては、まずはブール代数・デジタル回路を学ぶと、論理ゲートを使うと、2進数で計算やデータの保持できることが、理解できます。では、そんな都合のいい論理ゲートが具体的にどこに存在するのかというと、半導体を勉強すると、デジタル回路に必要な論理ゲートを作ることができる事が理解できます。半導体は、性能・製造上他の物と比べると極めて都合のいい物質です。半導体技術の進化なくして、コンピュータの技術は進化しない。そのため、多くの国や会社が莫大な投資をしてきて、今の優れたAI技術や、Web技術が実現したと言えるほど、半導体技術がコンピュータ技術のコアであるというお話をしました。ここまで勉強すれば、コンピュータは半導体によって作られたデジタル回路で動いていることが分かると思います。
そして、次に、コンピュータアーキテクチャを学ぶと、具体的に半導体やデジタル回路を使って、どのようにコンピュータを作っているのかが理解できます。コンピューターアーキテクチャという分野では、コンピューターにどのような部品が必要なのか、そしてそれらがどのように連携しているのかを学びます。ここまで勉強すれば、コンピュータのハード的な仕組みは大体理解出来るでしょう。
しかし、これらを勉強しても、本を読むだけになって、手を動かしながら学ぶことが難しいので、理解したように感じれません。 そこで、次にFPGAを使って、実際にCPUを作ると、非常に理解が深まります。ここまで勉強すれば、コンピュータのハード的な仕組みは完全に理解出来ると思います。
ハードウェアだけでは、コンピュータは動かないので、次にソフトウェアの話をしました。
まずは、手っ取り早く、プログラミングの学習をすれば、アルゴリズムやデータ構造の仕組みが理解できます。このとき、コンピュータの仕組みを理解するのが目的なので、Pythonではなく、C言語を選んでください。C言語を勉強すると、一般的なアルゴリズムやデータ構造を使ったプログラミングが出来るようになります。
しかし、自分で作ったプログラムがどのような仕組みでハードウェアによって実行されているのか、これだけでは、全然理解できません。 そこで、次にコンパイラ、リンカ、ローダの勉強をすると、その疑問が解決します。ここまで勉強すると、単一のプログラムがどのような仕組みで動いているのかが、理解できるようになります。
しかし、コンピュータでは、1つのプログラムだけでなく、複数のプログラムが同時に動いています。 そこで、次にOSについて学習すると、その辺の疑問が晴れていきます。OSは、アプリケーションの前提となるような機能を実現しています。
ここまで、勉強したら、ハードウェアからソフトウェアまで、コンピュータがどういう仕組みで動いているのか完全に理解できるようになると思います。
本日のロードマップを参考に勉強して、あなたにかかった魔法を解く事ができれば幸いです。 本日の動画は以上となります。ここまでご視聴ありがとうございました。
Reference
ハロー“Hello, World” OSと標準ライブラリのシゴトとしくみ