1969:UNIX 問世——C++ 誕生的土壤#
事件#
1969 年,貝爾實驗室(Bell Labs)的 Ken Thompson、Dennis Ritchie 等人開始開發 UNIX 作業系統。UNIX 與後來的 C 語言、以及 Bjarne Stroustrup 本人都出身於同一個實驗室——UNIX 是 C++ 誕生的土壤。
為何重要#
- UNIX 證明了「用高階語言寫作業系統」是可行的:整個系統可以用可攜的語言重寫,而不是绑死在組合語言上。
- 「一切皆檔案」、管線(pipe)、小工具組合的設計哲學,影響了後世 C++ 標準庫與工具鏈的設計(如 iostream 的串流概念)。
- UNIX 的可攜性需求,直接催生了 C 語言,進而催生了 C++。
理論與實用原因#
- 理論原因:分時(time-sharing)系統理論與模組化作業系統設計(Thompson & Ritchie 1974 的論文 The UNIX Time-Sharing System)。
- 實用原因:貝爾實驗室需要一套能在多種機器上執行、方便程式師協作的系統。
彌補了什麼缺陷#
彌補了當時作業系統「以組合語言撰寫、不可攜、難以維護」的缺陷——這也是後來 C++ 想在「系統程式設計」層面持續解決的同一個問題:如何兼顧效率與抽象。
程式範例#
管線與小工具組合:UNIX 哲學的具體呈現
# 舊做法:在大型專屬程式裡一次性完成過濾、排序、統計——難以組合與重用
# UNIX 新做法:每個工具只做一件事,用管線(pipe)串接
cat server.log | grep ERROR | sort | uniq -c | sort -rn
# cat :把檔案內容倒進串流(一切皆檔案)
# grep :過濾含 ERROR 的行
# sort :排序(讓相同行相鄰)
# uniq -c:去重並計數
# sort -rn:按次數由大到小排——即時統計出現最頻繁的錯誤
C 寫的簡單系統程式:一切皆檔案與串流
/* UNIX:檔案、裝置、pipe 全是檔案描述子(fd),讀寫一律同一組系統呼叫 */
#include <fcntl.h>
#include <unistd.h>
int main(void) {
/* open 不只開檔案——也可以是 /dev/tty、pipe 端點,介面完全一致 */
int fd = open("log.txt", O_RDONLY);
if (fd < 0) return 1;
char buf[256];
ssize_t n;
/* read/write 對任何 fd 都適用:這就是「一切皆檔案」的串流抽象 */
while ((n = read(fd, buf, sizeof buf)) > 0)
write(STDOUT_FILENO, buf, n); /* STDOUT_FILENO 也是一個檔案描述子 */
close(fd);
return 0;
}
串流概念對後世 C++ iostream 的影響
// UNIX 的「檔案描述子 + 串流」思想,被 C++ iostream 繼承並物件化:
// 同一套 << 運算子,可以寫到檔案、字串、標準輸出——與 fd 的統一介面如出一轍。
#include <fstream>
#include <iostream>
#include <sstream>
int main() {
std::ofstream file("out.txt"); // 檔案串流
std::stringstream ss; // 字串串流
std::ostream& targets[] = {std::cout, file, ss}; // 三者介面一致
for (std::ostream& os : targets)
*os << "hello stream" << "\n"; // 與 write(fd, ...) 同一哲學
return 0;
}