1973 - Thompson 與 Ritchie 的 UNIX(可攜式作業系統)#
案件摘要#
1973 年,Ken Thompson(1943–) 與 Dennis Ritchie(1941–2011) 在貝爾實驗室把 UNIX 用 C 語言重寫:
這是作業系統的革命——UNIX 從此可攜:
UNIX 的三大發明: 1. 檔案系統的統一:「一切皆檔案」; 2. 管線(pipe):程式的組合(ls | grep | wc); 3. 可攜性:用 C 寫,可以移植到任何硬體。 1983 年,兩人獲得圖靈獎—— 今天的世界:Linux(1991)、Android(2008)、macOS、iOS——全部是 UNIX 的後代。
前因 -- 為什麼會有這個案子#
- Multics 的失敗(1964–1969): MIT、貝爾實驗室、GE 合作開發 Multics(分時作業系統)—— 目標太宏大(公用電腦、數百用戶),延期、超支。 1969 年,貝爾實驗室退出—— Thompson 與 Ritchie 留下了「無所事事」的時間與一台舊電腦。
- Space Travel 與 PDP-7(1969): Thompson 為了玩太空旅行遊戲(Space Travel), 在一台報廢的 PDP-7 上寫了一個小作業系統—— UNIX 的前身(本來要叫 Unics,後來拼成 UNIX)。
- C 語言的誕生(1971–1973): Ritchie 從 B 語言(Thompson 的,源自 BCPL)發展出 C 語言——
C 的設計目標:「夠高階能寫 OS,夠低階能控制硬體」。 - 1973 年的重寫: Thompson 與 Ritchie 用 C 把 UNIX 重寫—— 第一個用高階語言寫的作業系統!
1973 年 11 月,他們在 ACM SOSP 會議發表《UNIX 分時系統》—— UNIX 從此傳遍世界。
線索與推理 -- 數學式、程式、理論#
第一條線索:「一切皆檔案」(UNIX 的統一哲學)#
UNIX 的核心思想:
統一的介面:
open(path, mode) // 開啟任何東西(檔案、裝置、管線)
read(fd, buf, n) // 讀
write(fd, buf, n) // 寫
close(fd) // 關閉
/dev/tty、印表機 = /dev/lp—— 程式不需要知道「這是什麼裝置」; - 這是「資料獨立性」(Codd 1970)的作業系統版—— 邏輯與物理分離。 第二條線索:管線(pipe)與程式的組合#
管線(1973):把一個程式的輸出接到另一個程式的輸入:
ls | grep ".c" | wc -l # 列出 .c 檔案並計數
這是函數式思想的作業系統版—— - ls、grep、wc 各自只做一件事(單一職責); - 組合產生無限可能。 McIlroy 的建議(1964/1973): Douglas McIlroy(貝爾實驗室)提出管線的思想:
「讓每個程式做好一件事;讓程式的輸出可以成為另一個程式的輸入。」 這是 UNIX 哲學的宣言。
第三條線索:可攜性與 C 語言(1973)#
C 語言的設計(Ritchie, 1971–1973): - 高階:函數、迴圈、結構(struct); - 低階:指標、位元運算、直接記憶體存取; - 編譯到高效機器碼。 UNIX 的可攜性:
1976–1977:UNIX 被移植到 Interdata 8/32—— 證明了可攜性! ** fork 的誕生(1970s)**: 伯克利的 BSD UNIX(1977)—— 「fork」的傳統(分岔、變種)從此成為軟體的文化。
Python:UNIX 哲學的數值驗證(管線與組合)#
import subprocess
import os
# 1) 管線的組合(小程式的組合)
print("UNIX 哲學:小程式的組合(管線)")
# 模擬管線:產生資料 → 過濾 → 計數
def gen_numbers(n=100):
"""產生 1..n 的數字(模擬 ls)"""
return [str(i) for i in range(1, n+1)]
def filter_even(nums):
"""過濾偶數(模擬 grep)"""
return [x for x in nums if int(x) % 2 == 0]
def count(items):
"""計數(模擬 wc -l)"""
return len(items)
# 組合管線
result = count(filter_even(gen_numbers(100)))
print(f" 1..100 中的偶數個數 = {result}(管線:gen | filter | count)")
# 每個環節只做一件事
print(" → 每個環節單一職責;組合產生無限可能\n")
# 2) 「一切皆檔案」的驗證(Python 的檔案介面)
print("「一切皆檔案」(統一介面):")
# 用同一個介面處理不同來源
from io import StringIO, BytesIO
# 字串當檔案
s_file = StringIO("hello unix")
content = s_file.read()
print(f" 字串當檔案:read() = '{content}'")
# 實際檔案
with open("/tmp/unix_demo.txt", "w") as f:
f.write("everything is a file")
with open("/tmp/unix_demo.txt", "r") as f:
print(f" 實際檔案:read() = '{f.read()}'")
print(" → 同一個介面(read/write)處理任何來源\n")
# 3) 實際的管線(subprocess,真正的 OS 管線)
print("真正的 OS 管線(subprocess):")
p1 = subprocess.Popen(['echo', 'hello unix world'],
stdout=subprocess.PIPE)
p2 = subprocess.Popen(['tr', 'a-z', 'A-Z'],
stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()
output = p2.communicate()[0].decode()
print(f" echo 'hello unix world' | tr a-z A-Z → '{output.strip()}'")
print(" → 管線 = 程式的組合(1973 UNIX 的發明)\n")
# 4) 可攜性:C 語言的編譯流程
print("可攜性(C 語言,1973):")
print(" source.c → 編譯 → 機器碼(x86/ARM/RISC-V)")
print(" → 同一個 source.c 可以編譯到任何硬體")
print(" → UNIX 用 C 寫 → 可移植到任何硬體(1973 的革命)\n")
# 5) UNIX 的後代
print("UNIX 的家族樹:")
print(" UNIX(1969/1973)")
print(" ├── BSD(1977,伯克利)")
print(" │ ├── FreeBSD、OpenBSD、NetBSD")
print(" │ └── macOS(XNU 核心,2001)、iOS")
print(" ├── System V(1983,AT&T)→ Solaris、AIX")
print(" ├── Minix(1987,Tanenbaum)→ 教學用")
print(" │ └── Linux(1991,Torvalds)")
print(" │ ├── Android(2008)")
print(" │ └── 伺服器、超級電腦、嵌入式")
print(" → 今天的世界:幾乎所有裝置都跑 UNIX 的後代")
UNIX 哲學:小程式的組合(管線)
1..100 中的偶數個數 = 50(管線:gen | filter | count)
→ 每個環節單一職責;組合產生無限可能
「一切皆檔案」(統一介面):
字串當檔案:read() = 'hello unix'
實際檔案:read() = 'everything is a file'
→ 同一個介面(read/write)處理任何來源
真正的 OS 管線(subprocess):
echo 'hello unix world' | tr a-z A-Z → 'HELLO UNIX WORLD'
→ 管線 = 程式的組合(1973 UNIX 的發明)
可攜性(C 語言,1973):
source.c → 編譯 → 機器碼(x86/ARM/RISC-V)
→ 同一個 source.c 可以編譯到任何硬體
→ UNIX 用 C 寫 → 可移植到任何硬體(1973 的革命)
UNIX 的家族樹:
UNIX(1969/1973)
├── BSD(1977,伯克利)
│ ├── FreeBSD、OpenBSD、NetBSD
│ └── macOS(XNU 核心,2001)、iOS
├── System V(1983,AT&T)→ Solaris、AIX
├── Minix(1987,Tanenbaum)→ 教學用
│ └── Linux(1991,Torvalds)
│ ├── Android(2008)
│ └── 伺服器、超級電腦、嵌入式
→ 今天的世界:幾乎所有裝置都跑 UNIX 的後代
結案 -- 後果與影響#
- 作業系統的革命(1973):
- UNIX 的可攜性證明:OS = 軟體(不是硬體的一部分);
- C 語言成為系統程式設計的標準(至今仍是—— Linux 核心、Windows 核心、嵌入式都用 C)。
- C 語言的世紀(1973–):
現代語言的語法一半來自 C(花括號、分號、函數宣告)。 - K&R《C 程式設計語言》(1978)——最經典的教科書之一; - ANSI C 標準(1989)、C99/C11/C23。 - UNIX 的家族樹(1977–):
- Linux(1991,Torvalds,21 歲):Minix 的替代品—— 今天 100% 的超級電腦、70% 的伺服器、80% 的手機(Android)跑 Linux;
- 開源運動(1983–):Stallman 的 GNU(1983)、Torvalds 的 Linux(1991)—— UNIX 的文化(fork、共享)孕育了開源。
- 管線與組合的哲學(1973–):
UNIX 哲學影響了: - 微服務(microservices, 2010s):小服務的組合—— 分散式系統的「管線」; - 函數式程式設計:高階函數的組合; - Docker(2013)與 Kubernetes(2014):容器的組合—— 「一切皆容器」是「一切皆檔案」的雲端版。 - 與 Multics 的對照(1969):
Dijkstra 1968 的「簡單是可靠的前提」在 UNIX 上得到實踐—— UNIX 的成功證明了「小而美」的工程哲學。 - 圖靈獎(1983): Thompson 與 Ritchie 1983 年獲圖靈獎—— 表彰「UNIX 作業系統與 C 語言」。 - Ritchie 2011 年去世(與 Steve Jobs 同月——媒體只報導 Jobs,工程師紀念 Ritchie); - Thompson 後來創造了 UTF-8(1992)與 Go 語言(2009)。 - 現代應用(2000s–): - 雲端(AWS、GCP):跑 UNIX 的後代; - 物聯網:嵌入式 Linux; - AI 訓練:GPU 叢集跑 Linux。
- 歷史定位:Thompson 與 Ritchie 是「現代運算世界的建築師」——
一句話:你的手機、電腦、雲端——全部跑著 UNIX 的後代。
關鍵人物與文獻#
- K. Thompson & D. Ritchie:The UNIX Time-Sharing System(1973/1974);C 語言(1973);1983 圖靈獎。
- D. McIlroy:管線的思想(1964/1973)——UNIX 哲學。
- B. Kernighan & D. Ritchie:The C Programming Language(1978)。
- R. Stallman:GNU 計畫(1983)——開源運動。
- L. Torvalds:Linux(1991)——UNIX 的最大後代。
- 相關案件:
1957-巴克斯FORTRAN.md、1968-結構化程式設計.md、1982-蘭波特Paxos.md、作業系統/README.md。