跳轉到

1973 - Thompson 與 Ritchie 的 UNIX(可攜式作業系統)#

案件摘要#

1973 年,Ken Thompson(1943–) 與 Dennis Ritchie(1941–2011) 在貝爾實驗室把 UNIX 用 C 語言重寫:

\[ \boxed{\text{作業系統用高階語言寫(不再是組合語言)}} \]

這是作業系統的革命——UNIX 從此可攜:

\[ \text{組合語言(綁死硬體)} \xrightarrow{\text{UNIX + C(1973)}} \text{可攜式(跨硬體)}. \]

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)。
\[ \text{遊戲(太空旅行)} \xrightarrow{\text{PDP-7(1969)}} \text{UNIX 的誕生}. \]
  • C 語言的誕生(1971–1973): Ritchie 從 B 語言(Thompson 的,源自 BCPL)發展出 C 語言——
\[ \text{BCPL(1966)} \to \text{B(1969)} \to \text{C(1971–1973)}. \]

C 的設計目標:「夠高階能寫 OS,夠低階能控制硬體」。 - 1973 年的重寫: Thompson 與 Ritchie 用 C 把 UNIX 重寫—— 第一個用高階語言寫的作業系統!

\[ \boxed{\text{OS} = \text{軟體(可以移植)} \ne \text{硬體的一部分}} \]

1973 年 11 月,他們在 ACM SOSP 會議發表《UNIX 分時系統》—— UNIX 從此傳遍世界。

線索與推理 -- 數學式、程式、理論#

第一條線索:「一切皆檔案」(UNIX 的統一哲學)#

UNIX 的核心思想:

\[ \boxed{\text{檔案、目錄、裝置、管線、socket = 一律是「檔案」}} \]

統一的介面:

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 檔案並計數

\[ \boxed{\text{小程式的組合(composability)} > \text{大程式的萬能}} \]

這是函數式思想的作業系統版—— - ls、grep、wc 各自只做一件事(單一職責); - 組合產生無限可能。 McIlroy 的建議(1964/1973): Douglas McIlroy(貝爾實驗室)提出管線的思想:

「讓每個程式做好一件事;讓程式的輸出可以成為另一個程式的輸入。」 這是 UNIX 哲學的宣言。

第三條線索:可攜性與 C 語言(1973)#

C 語言的設計(Ritchie, 1971–1973): - 高階:函數、迴圈、結構(struct); - 低階:指標、位元運算、直接記憶體存取; - 編譯到高效機器碼。 UNIX 的可攜性:

\[ \text{UNIX(C 語言)} \xrightarrow{\text{重編譯}} \text{任何硬體(PDP-11、VAX、x86、ARM)}. \]

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):
\[ \boxed{\text{OS 用高階語言寫 = 可攜式的開始}} \]
  • UNIX 的可攜性證明:OS = 軟體(不是硬體的一部分);
  • C 語言成為系統程式設計的標準(至今仍是—— Linux 核心、Windows 核心、嵌入式都用 C)。
  • C 語言的世紀(1973–):
\[ \text{C(1973)} \to \text{C++(1985)} \to \text{Java(1995)} \to \text{C\#(2000)} \to \text{Go(2009)} \to \text{Rust(2015)}. \]

現代語言的語法一半來自 C(花括號、分號、函數宣告)。 - K&R《C 程式設計語言》(1978)——最經典的教科書之一; - ANSI C 標準(1989)、C99/C11/C23。 - UNIX 的家族樹(1977–):

\[ \text{UNIX(1973)} \xrightarrow{\text{BSD(1977)}} \text{macOS、iOS} \xrightarrow{\text{Minix→Linux(1991)}} \text{Android、伺服器、超級電腦}. \]
  • Linux(1991,Torvalds,21 歲):Minix 的替代品—— 今天 100% 的超級電腦、70% 的伺服器、80% 的手機(Android)跑 Linux;
  • 開源運動(1983–):Stallman 的 GNU(1983)、Torvalds 的 Linux(1991)—— UNIX 的文化(fork、共享)孕育了開源。
  • 管線與組合的哲學(1973–):
\[ \boxed{\text{小程式的組合} > \text{大程式的萬能}} \]

UNIX 哲學影響了: - 微服務(microservices, 2010s):小服務的組合—— 分散式系統的「管線」; - 函數式程式設計:高階函數的組合; - Docker(2013)與 Kubernetes(2014):容器的組合—— 「一切皆容器」是「一切皆檔案」的雲端版。 - 與 Multics 的對照(1969):

\[ \text{Multics(宏大、失敗)} \xrightarrow{\text{UNIX(簡單、成功)}} \text{「簡單勝於宏大」} \]

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。

\[ \text{UNIX(1973)} \xrightarrow{} \text{雲端 + 物聯網 + AI(2010s)}. \]
  • 歷史定位:Thompson 與 Ritchie 是「現代運算世界的建築師」——
\[ \text{Multics 的失敗(1969)} \xrightarrow{\text{遊戲與 PDP-7}} \text{UNIX(1969/1973)} \xrightarrow{} \text{C(1973)} \xrightarrow{} \text{Linux(1991)} \xrightarrow{} \text{雲端時代}. \]

一句話:你的手機、電腦、雲端——全部跑著 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。