Chapter 2 — コンピュータの設計 ★★☆ 中級 ⏱ 25–30分

ソフトウェアの
階層構造

トランジスタの ON/OFF から Python コードまで——ハードウェアとソフトウェアをつなぐ「抽象化の橋」を理解しよう。

Section 1

抽象化の階段

各レイヤーをクリックして詳細を見てみよう

📱
アプリケーション層
Python / Java / JavaScript ...
人間が書く高水準プログラム。ゲーム・Webサービス・AI アプリなど。
ハードウェアの詳細を知らなくても開発できるのは、下の層がすべて隠蔽してくれているから。
例:print("Hello") の1行で、ディスプレイに文字が出る。
🔗
ランタイム・標準ライブラリ
libc / glibc / Python runtime ...
アプリと OS の間の「便利な道具箱」。printf()malloc() など。
内部でシステムコールを呼び出してOSに仕事を頼んでいる。
🖥️
オペレーティングシステム (OS)
Linux / macOS / Windows ...
ハードウェアを管理する「司令塔」。プロセス管理・メモリ管理・ファイルシステム・デバイスドライバ。
アプリは直接ハードウェアを操作できず、必ずOSを通じてリソースを要求する。
次の Chapter 3 で詳しく学びます →
📝
命令セットアーキテクチャ (ISA)
x86-64 / ARM / RISC-V ...
ハードウェアとソフトウェアの「共通言語」。CPUが理解できる命令の一覧表。
ADD / MOV / JMP などのアセンブリ命令がこの層に対応する。
ISA が同じなら、異なるCPU設計でも同じプログラムが動く(互換性の源泉)。
⚙️
マイクロアーキテクチャ (CPU 内部)
パイプライン / キャッシュ / ALU ...
ISA の命令を実際に実行するCPU内部の設計。Verilog で記述する部分。
同じ ISA でも各社が異なる内部設計を持つ(Intel Core i9 と Apple M4 はどちらも同じプログラムが動く)。
Chapter 2 のアーキテクチャ・Verilog はこの層を学んだ。
🔌
デジタル論理回路
AND / OR / NOT / Flip-Flop ...
ゲートとフリップフロップで構成された回路。Chapter 1 で学んだ論理ゲートの世界。
1億個以上のゲートが1つの CPU チップに収まっている。
トランジスタ(物理層)
MOSFET / 3nm / 数兆個 ...
電圧の ON/OFF でスイッチとして機能する半導体素子。
最新の CPU には 約 500 億個のトランジスタが入っている(Apple M4 Ultra の場合)。
Chapter 1 のスイッチの歴史がこの起源。
💡 抽象化の意義: 各層は下の層の詳細を隠蔽(カプセル化)することで、上の層の開発者が「下を知らなくていい」状態を実現している。 Python プログラマーはトランジスタを知らなくてよく、CPU 設計者はOSの詳細を知らなくてよい——これが大規模なコンピュータシステムを人間が作れる理由。
Section 2

ソースコードが機械語になるまで

コンパイラ・アセンブラ・リンカ・ローダーの役割

📝
ソースコード
C / C++ / Rust
🔬
コンパイラ
gcc / clang
🔩
アセンブリ
.s ファイル
🔧
アセンブラ
as
📦
オブジェクト
.o ファイル
🔗
リンカ
ld
🚀
実行ファイル
a.out / .exe
🔬 コンパイラの仕事
  1. 字句解析 — コードをトークンに分割
  2. 構文解析 — 構文木(AST)を構築
  3. 意味解析 — 型チェック・スコープ確認
  4. 中間表現 — 最適化しやすい IR に変換
  5. コード生成 — CPU の命令セットに変換
🔗 リンカの仕事

複数の .o ファイルと標準ライブラリを1つの実行ファイルに結合する。

例:printf() の実体は libc.a の中にある。コンパイル時には「後で繋ぐ」という参照だけ残し、リンカが最終的に繋ぎ合わせる。

📥 ローダーの仕事

実行ファイルをメモリに展開して CPU が実行できる状態にする。OS の一部として動く。

コード領域・データ領域・スタック・ヒープをメモリ上に配置し、プログラムカウンタを先頭命令に設定してプログラムが始動する。

📌 具体例:a = 1 + 2 の変身

// C ソースコード
int a = 1 + 2;
; アセンブリ(x86-64)
mov eax, 1
add eax, 2
mov [a], eax
// 機械語(16進数)
B8 01 00 00 00
83 C0 02
89 45 FC

コンパイラが最適化すると、コンパイル時に 1+2=3 を計算して直接 mov [a], 3 に置き換えることもある(定数畳み込み)。

Section 3

システムコール

アプリと OS の境界線

ユーザー空間 (User Space)
ブラウザ
音楽プレーヤー
Python スクリプト
↑ 制限された権限で動作 — ハードウェアに直接触れない
══ システムコール インターフェース ══
アプリが OS に「お願い」する唯一の窓口
カーネル空間 (Kernel Space)
プロセス管理
メモリ管理
ファイルシステム
デバイスドライバ
ネットワーク
セキュリティ
↓ 特権モードで動作 — すべてのハードウェアにアクセス可
── CPU / メモリ / ディスク / NIC / GPU (物理ハードウェア) ──

代表的なシステムコール(Linux)

システムコール 何をOSに頼む? アプリから見ると
read() / write()ファイル・標準入出力の読み書きprint() の裏で動く
open() / close()ファイルのオープン・クローズopen("file.txt")
fork() / exec()新しいプロセスの生成・プログラム置き換えシェルがコマンドを実行するとき
mmap() / brk()メモリの確保・解放malloc() の裏で動く
socket() / connect()ネットワーク接続HTTP 通信の裏で動く
exit()プログラムの終了をOSに通知プログラム終了時に必ず呼ばれる
🛡️ なぜ「ユーザー空間」と「カーネル空間」を分けるの?

アプリが自由にハードウェアを操作できると、悪意あるプログラムがメモリ全体を覗いたり、 他のプロセスのデータを改ざんしたりできてしまいます。
OS が唯一の「門番」となることで、セキュリティ・安定性・公平なリソース分配が実現されます。

今日学んだこと

✅ 抽象化の7層

トランジスタ→ゲート→回路→ISA→OS→ライブラリ→アプリ。各層が下の詳細を隠す。

✅ コンパイルの流れ

コンパイラ→アセンブラ→リンカ→ローダーで、ソースコードが実行される。

✅ システムコール

アプリとOSの唯一の境界線。read()fork()mmap() など。

✅ 特権モードの意義

ユーザー空間 / カーネル空間の分離がセキュリティと安定性を保証する。