跳轉到

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   # 三個小程式組成一件工作

相關條目#