Unix 歷史簡介
何 謂 Unix ?
這 是 一 個 十 分 有 趣 的 問 題 , 如 果 問 題 何 謂 M$-DOS ? 何 謂 VMS 或 何 謂 NT ? 回 答 它 們 都 是 OS 倒 也 不 會 有 人 有 異 議 。 不 過 對 於 Unix , 問 題 就 變 得 複 雜 了 。 不 是 說 Unix 不 是 OS , 但 這 回 答 對 於 很 Unix 玩 家 來 說 總 顯 得 過 於 片 面 及 少 看 了 Unix 。
Unix 原 本 是 一 個 由 Bell Labs 發 展 出 來 的 多 用 戶 (Multi-User) 多 工 (Multitasking) 的 OS 。 Unix 這 名 字 主 要 是 對 之 前 Bell Labs 曾 參 與 的 Multics 計 劃 的 反 嘲 。 由 於 其 Source Code 簡 單 易 理 解 及 高 移 植 性 ( 首 個 使 用 高 階 程 式 語 言 編 寫 成 的 OS) , 加 上 初 AT&T 對 Unix Source Code 版 權 的 態 度 蠻 開 放 ( 或 者 正 確 來 說 應 是 AT&T 還 未 發 覺 Unix 是 這 麼 值 錢 的 ) 被 不 少 大 學 及 公 司 移 植 到 很 多 不 同 的 平 台 。 現 在 上 至 超 級 電 腦 如 Cray , 下 至 個 人 電 腦 如 Macintosh 及 IBM PC 都 有 Unix 。 所 以 比 較 正 確 來 說 , Unix 是 代 表 了 一 系 列 的 OS , 包 括 一 些 不 含 任 何 原 身 Bell Labs Unix 程 式 碼 但 擬 似 Unix 的 OS ( 就 是 所 謂 的 Unix-clone , Linux 就 是 當 中 的 俵 俵 者 ) 。
現 在 由 最 初 Bell Labs 發 展 出 Unix Source code 版 權 屬 於 SCO 而 其 名 字 UNIX ( 全 大 階 ) 則 屬 於 The Open Group (TOG) 所 有 。 TOG 制 定 了 一 系 列 UNIX 標 準 , 當 任 何 生 產 商 的 OS 要 符 合 其 標 準 才 可 用 UNIX 這 個 名 字 , 如 DEC 的 Digital UNIX 。
然 而 , 這 也 還 不 能 把 Unix 完 整 地 描 述 出 來 。 在 Larry Wall 及 Randal L. Schwartz. 所 著 的 『 Programming Perl 』 的 辭 解 (Glossary) 中 , 就 打 趣 地 說 Unix 是 一 個 大 而 不 斷 演 進 的 語 言 , 當 中 包 含 了 大 量 互 相 不 協 調 的 語 法 。 講 Unix 的 人 總 認 為 它 很 易 學 , 因 為 它 可 以 很 容 易 地 被 改 變 成 自 己 熟 識 的 語 法 。 這 解 析 有 點 反 Unix 味 , 但 也 顯 示 出 對 於 很 多 人 來 說 , Unix 已 超 越 了 一 個 OS , 象 徵 了 一 套 操 作 環 境 、 語 言 甚 至 哲 學 及 文 化 。 或 者 借 一 句 『 君 處 牆 外 , 焉 能 知 宮 庭 之 美 ? 』 , 只 有 真 正 了 解 及 喜 愛 Unix 的 人 才 會 明 白 Unix 的 哲 學 及 文 化 。
怎 了 ? 過 玄 嗎 ? 太 過 含 糊 嗎 ? 其 實 就 以 擬 似 Unix 來 說 , 也 有 程 度 之 分 。 M$-DOS 在 設 計 時 就 借 了 Unix 不 少 靈 感 , 如 樹 狀 結 構 的 檔 案 系 統 (Tree-structured File System) 及 管 道 (pipe) 等 。 Windoze NT 本 身 也 支 援 POSIX.1 ( 一 套 定 義 了 Unix 基 本 的 System Call 的 標 準 ) , 但 總 沒 有 人 會 認 同 它 們 是 Unix 的 一 種 。 個 人 認 為 UNIX FAQ part6 中 對 Unix 的 定 義 不 錯 , 給 我 弄 得 糊 塗 的 朋 友 參 考 。
『 我 們 所 提 的 Unix 指 的 是 一 個 通 常 是 由 C 寫 成 的 作 業 系 統 , 它 有 階 層 式 的 檔 案 系 統 , 統 合 了 檔 案 和 裝 置 (device) I/O , 其 系 統 函 式 呼 叫 ( system call ) 介 面 包 含 了 如 fork() , pipe() 等 服 務 , 而 且 它 的 使 用 者 介 面 包 含 cc , troff , grep , awk 之 類 的 工 具 及 某 一 種 shell 。 』
Multics 的 失 敗
要 談 Unix 的 歷 史 , 一 定 要 回 溯 到 1965-68 年 美 國 電 話 及 電 報 公 司 (American Telephone and Telegraph Inc., AT&T) 、 通 用 電 器 公 司 (General Eletrics, G.E.) 及 麻 省 理 工 學 院 (Massachusetts Institute of Technology, MIT) 的 Multics (MULTiplexed Information and Computing Service) 計 劃 。
在 那 時 期 , 大 部 份 電 腦 都 是 採 用 批 次 處 理 (Batch Processing) 方 式 。 為 了 顯 示 多 用 途 (general-purpose) 及 多 用 戶 (multiuser) 的 分 時 系 統 (timesharing system) 是 可 行 的 , MIT 以 在 試 驗 CTSS(Compatible Time-Sharing System) 當 中 所 得 的 研 究 成 果 取 得 了 G.E 的 同 意 合 作 為 G.E. 的 大 型 電 腦 GE-635 開 發 一 套 全 新 的 分 時 作 業 系 統 ─ ─ Multics 。
由 於 Multics 有 不 少 設 計 在 當 時 是 頗 新 穎 具 富 創 意 的 , 因 此 吸 引 了 不 少 研 究 機 構 的 注 意 。 而 其 中 那 時 仍 和 AT&T 同 一 家 的 貝 爾 實 驗 室 (Bell Labraries, BellLabs) 更 在 六 十 年 代 末 曾 正 式 參 於 過 Multics 計 劃 , 那 時 剛 由 加 州 柏 克 萊 大 學 (University of California at Berkeley, UCB) 去 到 Bell Labs 的 Ken Thompson 就 是 Multics 研 究 小 組 的 一 員 。
不 過 Multics 的 發 展 進 度 很 慢 , 原 本 預 算 兩 年 有 成 果 但 過 了 很 久 仍 沒 有 多 大 進 展 。 到 了 1969 年 , Bell Labs 終 於 決 定 放 棄 , 退 出 了 Multics 計 劃 。 Bell Labs 的 Dennis Ritchie ( K&R 的 R ) 曾 描 述 當 時 Bell Labs 由 管 理 層 到 研 究 員 都 認 為 Multics 的 開 發 是 太 遲 及 太 貴 了 。
Multics 自 Bell Labs 退 出 後 , 仍 有 繼 續 發 展 。 Honeywell 在 1972 年 購 入 了 G.E. 的 電 腦 部 門 後 更 把 Multics 進 出 商 業 市 場 , 但 始 終 不 算 太 成 功 。 在 Multics 比 較 流 行 的 八 十 年 代 , 約 有 75 至 100 台 每 台 價 值 數 百 萬 美 元 的 大 型 電 腦 跑 Multics 。 1977 年 , MIT 也 退 出 Multics 的 發 展 工 作 。 後 來 Honeywell 在 八 十 年 代 中 期 把 其 電 腦 上 的 事 業 賣 給 Bull 後 , Multics 的 發 展 亦 終 於 在 1988 年 打 上 一 個 句 號 。
『 角 落 中 乏 人 問 津 的 PDP-7 』 ( "little-used PDP-7 in a corner" )
然 而 , Thompson 曾 在 Multics 計 劃 當 中 為 GE-635 寫 了 個 叫 做 「 太 空 旅 行 」 (Space Travel) 的 遊 戲 程 式 。 這 個 程 式 模 擬 了 一 個 太 空 船 和 太 陽 系 的 環 鏡 。 Bell Labs 放 棄 Multics 後 , Thompson 打 算 找 一 台 機 器 把 「 太 空 旅 行 」 移 植 (port) 過 去 , 於 是 便 和 Ritchie 向 Bell Labs 提 議 買 一 台 電 腦 以 便 他 們 建 立 一 台 自 己 的 交 談 式 、 多 用 戶 、 分 時 系 統 , 不 過 他 們 的 申 請 並 沒 有 被 接 納 。 最 後 , Thompson 在 一 角 落 裡 發 現 了 一 台 很 少 人 用 的 PDP-7 (Programmed Data Processor) 。
PDP-7 是 迪 吉 多 (Digital Equipment Corporation, DEC) 在 1964 年 進 出 的 迷 你 電 腦 (minicomputer) 。 這 台 約 和 Commodore 64 同 級 的 電 腦 ?作 業 系 統 對 於 Thompson 來 說 十 分 簡 陋 , 於 是 Thompson 就 順 帶 以 他 在 Multics 計 劃 中 學 到 的 技 術 和 經 驗 , 為 這 台 過 時 的 電 腦 上 撰 寫 一 套 新 作 業 系 統 。 這 套 作 業 系 統 有 很 多 構 想 是 來 自 Multics , 包 括 樹 狀 結 構 (tree-structured) 的 檔 案 系 統 、 用 戶 層 面 的 命 令 解 釋 器 (Command Interpreter) , 簡 單 表 現 文 字 檔 及 對 週 邊 設 備 (Device) 的 綜 合 化 存 取 等 。
最 初 , Thompson 並 不 是 在 PDP-7 上 撰 寫 他 的 新 系 統 , 而 是 先 在 一 台 GE-635 上 使 用 GEMAP 組 譯 器 (Assembler) 的 巨 集 (Macros) 編 寫 程 式 , 再 經 由 一 後 置 處 理 器 (postprocesser) 產 生 可 供 PDP-7 讀 取 的 紙 帶 (paper tape) 。 這 樣 一 來 一 回 , 由 GE 到 PDP-7 , 直 到 一 個 雛 型 的 核 心 (Kernel) 、 一 個 編 輯 器 (Editor) 、 一 個 組 譯 器 (Assembler) 、 一 個 簡 單 的 Shell ( 命 令 解 釋 器 , Command Interpreter ) 及 一 些 公 用 程 式 如 rm 、 cat 、 及 cp 等 完 成 了 , 整 個 系 統 可 以 自 給 自 足 後 , 所 有 開 發 工 作 才 在 PDP-7 上 繼 續 。
而 這 套 作 業 系 統 最 初 由 與 Thompson 共 事 的 Brian W. Kernighan ( K&R C 中 的 K ) 命 名 為 Unics (UNiplexed Information and Computing System) , 和 Multics 開 了 個 玩 笑 。 1971 年 間 改 成 Unix , 用 Uni 對 Multi , cs 對 x 。 提 起 Unix 的 名 字 , 很 多 人 都 疑 惑 正 確 的 寫 法 是 全 大 楷 的 'UNIX' , 還 是 只 有 起 首 大 階 的 'Unix' 。 Ritchie 就 解 釋 說 'UNIX' 言 個 寫 法 源 自 1974 年 CACM 的 文 件 "The UNIX Time-Sharing System" , 當 時 這 班 先 鋒 研 究 者 剛 剛 得 了 個 新 的 typesetter 及 開 發 了 troff 。 一 大 班 人 正 對 small caps 字 款 著 了 迷 , 導 致 了 'UNIX' 的 產 生 。 仲 使 Ritchie 在 往 多 次 以 Unix 並 不 是 任 何 句 子 的 縮 寫 為 理 由 想 在 幾 份 Bell Labs 的 文 件 用 回 'Unix' , 最 後 都 失 敗 。 而 後 來 UNIX 的 註 冊 商 標 也 是 以 全 大 寫 為 準 。
First Edition Unix
到 了 1970 年 , 這 班 Unix 的 研 究 者 獲 得 配 合 一 台 新 的 十 六 位 元 電 腦 DEC PDP-11/20 , 條 件 就 是 要 為 Unix 加 入 較 佳 的 文 件 處 理 工 具 。 不 過 台 電 腦 迅 速 地 送 到 研 究 者 的 桌 上 後 , 它 的 磁 碟 足 足 慢 了 三 個 月 才 運 到 。 就 在 這 機 在 碟 未 到 的 等 候 時 間 中 , Thompson 用 PDP-11 的 組 合 語 言 (Assembly Langauge) 重 寫 了 整 個 Unix 核 心 及 基 本 的 命 令 。 當 時 那 台 PDP-11/20 只 有 24KB 記 憶 體 (Memory) , 這 個 最 早 期 的 PDP-11 版 Unix 就 佔 用 了 12KB , 其 餘 的 記 憶 就 被 拿 來 跑 用 戶 的 程 式 和 作 RAM Disk 。 僅 有 500KB 的 磁 碟 空 間 以 及 在 毫 無 記 憶 保 護 (Memory Protection) 的 情 況 下 , 支 持 三 個 用 戶 同 時 作 編 輯 和 格 式 化 文 件 和 那 群 先 鋒 開 發 者 繼 續 Unix 的 發 展 工 作 。
1971 年 11 月 , 這 班 懶 惰 的 開 發 者 終 於 把 第 一 版 Unix 的 說 明 書 (Manual) 定 稿 。 往 後 每 一 由 Bell Labs 發 展 出 來 Unix 的 版 本 都 以 同 時 出 版 的 說 明 文 件 的 版 號 為 準 。 如 所 謂 Unix Version 1 (V1) 其 實 就 是 指 第 一 版 (First Edition) Unix 說 明 書 所 載 的 Unix 。 所 以 在 Bell Labs 內 部 一 直 都 稱 呼 nth Edition Unix , 不 是 外 間 的 Unix Version n 。 V1 已 有 了 基 本 的 檔 案 系 統 、 fork() 、 roff (troff 的 前 身 ) 及 ed 等 , 並 被 用 作 處 理 專 利 文 件 的 工 具 。 而 pipe() 就 在 第 二 版 (Version 2) 中 初 次 出 現 。
C 的 誕 生
在 開 發 V1 時 , 由 於 PDP-7 和 PDP-11 的 組 合 語 言 差 異 很 大 , 令 移 植 的 工 作 非 常 因 難 。 Thompson 這 時 突 發 奇 想 , 覺 得 如 用 高 階 語 言 (High-level Langauge) 來 撰 寫 Unix , 移 植 和 維 護 的 工 作 都 會 變 得 簡 單 得 多 。 對 於 C 語 言 極 度 盛 行 的 今 日 , 這 想 法 可 能 不 怎 麼 。 但 在 當 時 絕 對 是 十 分 瘋 狂 , 執 行 效 率 要 高 且 記 憶 體 使 用 要 省 的 系 統 程 式 (System Software) 必 需 要 用 組 合 語 言 來 撰 寫 的 觀 念 早 已 根 植 在 當 時 每 一 個 電 腦 人 心 中 。
Thompson 首 先 嘗 試 使 用 FORTRAN 來 寫 , 不 過 沒 有 成 功 。 後 來 他 找 來 一 個 叫 BCPL 的 語 言 , 在 使 用 期 間 整 理 了 BCPL 的 若 干 功 能 , 成 了 另 一 個 新 的 程 式 語 言 B 。 V1 中 就 有 少 量 公 用 程 式 是 用 B 來 撰 寫 。 後 來 Ritchie 加 入 了 Unix 的 開 發 行 列 , 很 快 發 現 了 B 語 言 有 若 干 缺 點 , 如 資 料 型 態 (Data Type) 的 缺 乏 等 。 Ritchie 著 手 改 良 B 語 言 , 誕 生 了 著 名 的 C 語 言 。
1973 年 初 , C 語 言 的 重 要 特 性 大 都 完 成 了 。 在 各 方 條 件 都 足 夠 的 情 況 下 , Thompson 、 Ritchie 及 他 們 的 同 伴 在 同 年 的 夏 天 把 Unix 的 核 心 用 C 重 寫 。 這 也 是 所 謂 的 第 四 版 (Version 4, V4) , 有 九 成 多 的 程 式 碼 是 用 C 來 寫 。 在 整 個 作 業 系 統 史 上 , 這 是 一 件 很 重 要 的 事 , 也 是 Unix 的 轉 折 點 。 這 意 味 著 Unix 可 以 很 容 易 被 修 改 , 也 使 其 成 為 第 一 個 在 源 程 式 層 面 上 可 移 值 (source-portable) 的 作 業 系 統 , 可 以 在 很 短 時 間 移 值 (port) 另 一 台 的 電 腦 中 。