跳轉到

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;
}

相關條目#