跳轉到

1969 - Unix 誕生(極簡戰勝雄心)#

案件摘要#

1969 年,Bell 實驗室的 Ken Thompson 在被閒置的 PDP-7 上,用組合語言寫出一個極簡作業系統——Unix。 與 Multics 的雄心(見「1965-Multics公用電腦.md」)相反:單一檔案樹、一切皆檔案、小工具組合、極簡核心。

\[ \text{Multics(數百萬行、一次到位)} \quad \text{vs} \quad \text{Unix(幾千行、極簡正確)}. \]

歷史上最有影響力的作業系統,誕生於一台被淘汰的二手電腦上——極簡的勝利。

前因 -- 為什麼會有這個案子#

  • Multics 的撤退:Bell 實驗室 1969 年退出 Multics 專案——Thompson 與 Ritchie 失去了研究環境,也失去了「大型系統」的信仰。
  • 太空旅行遊戲的原始動機:Thompson 把自己的「Space Travel」遊戲移植到 PDP-7——需要一個檔案系統、行程管理、編輯器。遊戲逼出了作業系統。
  • 被閒置的 PDP-7:實驗室角落一台淘汰的二手機器(8K 記憶體)——資源的匱乏逼出了極簡。
  • Thompson 的偵探直覺:從 Multics 學到的不是「功能要全」,而是哪些思想是本質的——檔案樹、分時、一切皆檔案——其餘全部捨棄。

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

第一條線索:一切皆檔案 (everything is a file)#

Unix 的統一抽象:檔案、目錄、設備、行程資訊——全部是檔案描述子:

\[ \text{open / read / write / close} \quad \text{適用於一切}. \]
  • 磁碟、終端機、印表機、pipe——同一組系統呼叫。
  • 介面的統一 = 工具的組合成為可能(見第三條線索)。

第二條線索:單一階層檔案樹#

\[ / \;\subset\; \text{bin, etc, usr, home} \;\subset\; \cdots \]

從 Multics 學來的單一棵樹——所有資源的統一命名空間:

\[ \text{路徑} = \text{唯一的位址}. \]

第三條線索:管道與小工具組合(組合的力量)#

Thompson 發明管道 (pipe, 1973)——把一個工具的輸出接到另一個的輸入:

\[ \text{工具}_1 \;|\; \text{工具}_2 \;|\; \text{工具}_3 \quad\Longrightarrow\quad \text{組合爆炸的生產力}. \]

哲學(McIlroy 總結):

寫只做一件事但做好的程式;寫能協作的程式;寫能處理文字流的程式,因為那是通用介面。

小工具 × 組合 = 無限可能——這是 Unix 最深遠的發明:不是功能,而是組合性。

Python:Unix 管道思想的示範#

import subprocess

# 相當於 shell: cat /etc/passwd | cut -d: -f1 | sort | head -5
p1 = subprocess.Popen(["bash","-c","cat /etc/passwd"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["cut","-d:","-f1"], stdin=p1.stdout, stdout=subprocess.PIPE)
p3 = subprocess.Popen(["sort"], stdin=p2.stdout, stdout=subprocess.PIPE)
out = subprocess.check_output(["head","-5"], stdin=p3.stdout).decode()
print(out)
(四個只做一件事的工具,用管道組合成複雜任務——組合性的鐵證。)

Python:極簡核心的系統呼叫介面#

import os

# 一切皆檔案:讀檔案與讀設備是同一組呼叫
fd = os.open("/etc/hostname", os.O_RDONLY)
data = os.read(fd, 100); os.close(fd)
print("hostname:", data.decode().strip())

# 行程管理:fork + exec 的最小組合
pid = os.fork()
if pid == 0:
    os.execlp("echo", "echo", "hello from child")
else:
    os.wait()
(fork + exec + 一切皆檔案 = Unix 的極簡核心三寶。)

結案 -- 後果與影響#

  • Unix 的擴散:1973 年以 C 重寫後可移植(見「1973-Unix以C重寫.md」);1975 年第 6 版隨原始碼流出,在大學與企業全面擴散——AT&T 當時受管制無法賣電腦,反而讓 Unix 免費擴散。
  • C 語言的誕生:Ritchie 為 Unix 設計 C——成為此後 50 年系統軟體的通用語言(Linux、Windows 核心、Git 全是 C)。
  • 設計哲學的影響:
  • 組合性 → shell 腳本、Unix 工具鏈 → 今天的 DevOps 與資料管道。
  • 一切皆檔案 → /proc、/dev、Linux 的統一介面。
  • 極簡核心 → Thompson 自己後來與 Pike 合作 Plan 9;「極簡正確」的信仰也啟發了 Go 語言。
  • 1983 圖靈獎:Thompson 與 Ritchie 同獲——一台二手 PDP-7 上的幾千行程式碼,贏得了系統科學的最高榮譽。
  • 歷史教訓:Multics 用數百萬行證明了雄心的代價;Unix 用幾千行證明了極簡的力量——「Do one thing well」成為軟體工程的永恆偵探定律。

關鍵人物與文獻#

  • K. Thompson:Unix 首版 (1969);〈UNIX Implementation〉(1978)。
  • D. M. Ritchie & K. Thompson:〈The UNIX Time-Sharing System〉, CACM 17, 365 (1974);1983 圖靈獎。
  • D. McIlroy:管道與 Unix 哲學 (1978)。
  • 相關案件:1965-Multics公用電腦.md、1973-Unix以C重寫.md、1987-MINIX微核心.md。