1945 - Von Neumann 架構#
案件摘要#
1945 年,數學家 John von Neumann 發表《First Draft of a Report on the EDVAC》,把「程式與資料一起放在記憶體」的想法寫成了電腦的藍圖。這份報告定義了沿用至今的電腦基本結構,是所有現代電腦的「共同祖先」。
前因 -- 為什麼會有這個案子#
- ENIAC(1946 公開)沒有儲存程式:要改一個程式,得花工程師幾天時間重新插線、設定開關。
- ENIAC 團隊(Eckert 與 Mauchly)在設計後繼機 EDVAC 時,想解決「程式設定太慢」的問題。
- von Neumann 以顧問身份參與 1944 年起的 EDVAC 計畫,把討論結果整理成報告,於 1945 年 6 月流傳。
關鍵痛點可以用一個簡單的複雜度來刻劃:
\[ T_{\text{改程式}}^{\text{ENIAC}} \gg T_{\text{執行}}^{\text{ENIAC}} \]
重新設定程式所需的時間遠大於程式執行的時間——這在工程上完全不合理,必須破案。
線索與推理 -- 數學式、程式、理論#
定義:儲存程式(stored-program)概念#
一部電腦若其程式(指令序列)與資料同樣以二進位形式儲存在同一個可讀寫記憶體中,且指令可以像資料一樣被修改、讀取,則稱為儲存程式電腦。
統一的關鍵:記憶體中不區分「指令」與「資料」,只是取用方式不同:
\[ \text{memory}[pc] \xrightarrow{\text{當作指令}} \text{decode}, \qquad \text{memory}[addr] \xrightarrow{\text{當作資料}} \text{operand} \]
定義:五大單元#
報告將電腦分為五個單元:
| 單元 | 英文 | 職責 |
|---|---|---|
| 運算器 | Arithmetic Unit(ALU) | 執行加減乘除與邏輯運算 |
| 控制器 | Control Unit | 解碼指令、發出控制訊號 |
| 記憶體 | Memory | 儲存程式與資料 |
| 輸入 | Input | 將外界資料送入記憶體 |
| 輸出 | Output | 將計算結果送出 |
定義:指令週期(fetch–decode–execute)#
\[ \begin{aligned} \text{FETCH:}\quad & IR \leftarrow M[PC];\ PC \leftarrow PC + 1 \\ \text{DECODE:}\quad & (op,\ addr) \leftarrow \text{decode}(IR) \\ \text{EXECUTE:}\quad & AC \leftarrow f(op,\ AC,\ M[addr]) \end{aligned} \]
Python 實作:簡單 von Neumann CPU 模擬器#
# 簡化 von Neumann 機器:記憶體存程式+資料,一個累加器 AC
# 指令格式:(op, addr);op: 0=LOAD, 1=ADD, 2=SUB, 3=STORE, 4=JMP, 5=HALT
def run(program, data_mem_size=16):
mem = list(program) + [0] * data_mem_size # 程式與資料同放一個記憶體
pc, ac = 0, 0
while True:
op, addr = mem[pc]; pc += 1 # FETCH + DECODE
if op == 0: ac = mem[addr] # EXECUTE
elif op == 1: ac = ac + mem[addr]
elif op == 2: ac = ac - mem[addr]
elif op == 3: mem[addr] = ac
elif op == 4: pc = addr
else: break
return mem
# 計算 3 + 5 * 2 的直線版本(先算 5*2 用兩次加法近似):
# 資料區從位址 8 開始:m8=3, m9=5
prog = [(0, 8), # LOAD 3
(0, 9), # LOAD 5
(1, 9), # ADD 5 -> 10
(3, 10), # STORE m10
(0, 10), # LOAD 10
(1, 8), # ADD 3 -> 13
(3, 11), # STORE m11
(5, 0)] # HALT
print(run(prog)[11]) # 輸出 13
與 Harvard 架構的對照表#
| 特性 | Von Neumann 架構 | Harvard 架構 |
|---|---|---|
| 指令與資料儲存 | 同一記憶體 | 分開的兩套記憶體 |
| 匯流排 | 共用一組 | 指令、資料各自獨立 |
| 同時取指令+資料 | 不行(馮諾伊曼瓶頸) | 可以,頻寬較高 |
| 自修改程式 | 可能 | 不可能 |
| 硬體成本 | 較低 | 較高 |
| 典型應用 | 一般電腦(x86、ARM 上的記憶體子系統) | 微控制器(如 PIC、AVR)、DSP |
結案 -- 後果與影響#
- 幾乎所有現代電腦(桌上型、筆電、伺服器、手機)都是 von Neumann 架構的後裔。
- 副產品是「馮諾伊曼瓶頸」(von Neumann bottleneck):CPU 與記憶體之間共用通道限制了速度——這也促成了快取(cache)、哈佛化設計(分離 L1 指令快取)等後續發明。
- 儲存程式概念使「軟體產業」成為可能:程式從硬體接線中解放,變成可以販售、複製、修改的資料。
- 因報告只署名 von Neumann,Eckert 與 Mauchly 的貢獻被掩蓋,引發了歷史上著名的優先權爭議。
關鍵人物與文獻#
- John von Neumann(1903–1957):數學家,報告執筆者。
- J. Presper Eckert、John Mauchly:ENIAC/EDVAC 實際設計者,主張「高速讀寫記憶體」的概念源自其 Mercury 延遲線設計。
- 文獻:First Draft of a Report on the EDVAC, Moore School of Electrical Engineering, University of Pennsylvania, 1945(Moore School Lecture No. 42 的整理)。