1969:UNIX 誕生——C 語言的搖籃#
事件#
1969 年,Bell Labs 的 Ken Thompson、Dennis Ritchie 等人利用一部閒置的 PDP-7 開發出 UNIX 作業系統。最早的 UNIX 以組合語言撰寫,1973 年以 C 語言改寫,成為史上第一個用高階語言撰寫、又保持可攜性的主流作業系統。
為何重要#
- UNIX 是 C 語言誕生的直接原因:為了寫作業系統,才造了 C。沒有 UNIX 的可攜性需求,就不需要一個「脫離機器」的系統程式語言。
- UNIX 奠定了現代軟體工程的許多傳統:檔案系統階層、管道(pipe)、一切皆檔案、小工具組合的哲學。
- UNIX 的移植(PDP-7 → PDP-11 → 其他機器)正是 C 語言從 B 演化、從無型別到有型別的推手。
理論與實用原因#
- 理論原因:1960 年代的 Multics 計畫(UNIX 的前身)追求龐大完整的分時系統,結果過度複雜。Thompson 與 Ritchie 改走「極簡核心」路線,證明小型團隊也能做出可用的分時系統。
- 實用原因:組合語言寫的 OS 每換一種 CPU 就要全部重寫。Bell Labs 想要一份能在 PDP-11 上跑、將來又能搬去別的機器的系統——「可攜性」成為設計的第一目標,這正是 C 語言存在的理由。
彌補了什麼缺陷#
彌補了組合語言作業系統「與機器綁死、無法移植、難以維護」的缺陷;也彌補了 Multics「過度設計、資源需求過高」的缺陷。
程式範例#
組合語言(PDP-7,每換機器要全部重寫)與 C 的對比——同樣是「把檔案複製到輸出」:
; PDP-7 組合語言(概念示意,與 PDP-7 機器綁死)
lac buf ; 載入緩衝區位址
loop: sys read; buf; 512
sna ; 讀到 0 就結束
jmp done
sys write; buf; 512
jmp loop
done: sys exit
1973 年用 C 改寫後,這段程式碼「不綁機器」:
/* copy.c —— 一份原始碼,任何有 C 編譯器的機器都能編譯 */
#include <stdio.h>
int main(void) {
char buf[512];
size_t n;
while ((n = fread(buf, 1, sizeof buf, stdin)) > 0)
fwrite(buf, 1, n, stdout);
return 0;
}
UNIX 哲學的「小工具組合」——管道讓程式不需要知道彼此存在:
cat file.txt | grep error | wc -l # 三個小程式組成一件工作