今天地球上幾乎每一套正在執行的軟體,都能追溯到三個人正試圖解決同一個頭痛問題:如何在不小心損毀記憶體的情況下,撰寫大型且複雜的程式。

如果你今天開機一台筆電、打開瀏覽器、玩一款 3D 遊戲,或刷一張信用卡,你其實都在執行由 Dennis Ritchie、Bjarne Stroustrup 和 Anders Hejlsberg 塑造的程式碼。

他們一起打造了程式設計史上最著名的三部曲:C、C++ 和 C#。

接下來,我們來看看為什麼這三種語言會誕生、塑造它們的企業訴訟,以及為什麼這三者至今仍然在現代基礎架構中運作。


第一幕:Dennis Ritchie 的機器(C,1972)

      [ Dennis Ritchie @ 貝爾實驗室 ]
                    │
                    ▼
         "Trust the programmer."
                    │
            ┌───────┴───────┐
            ▼               ▼
      原始指標          Linux 與 Windows
      零安全性         在所有裝置上執行

1970 年代初期在貝爾實驗室,撰寫作業系統就等於撰寫原始組合語言。

如果你為某台機器寫了程式,而實驗室下個月又進了一台新電腦,你幾乎得把每一行都從頭重寫。

Dennis Ritchie 想要的是更實用的東西:一種讀起來像結構化程式碼、卻能直接對應到硬體暫存器的語言。

所以他打造了 C。

Dennis Ritchie at Bell Labs

規則:「信任程式設計師」

C 有一個根本假設:你知道自己在做什麼。

如果你叫 C 去取一塊記憶體,並覆寫第 4000 個位元組,它不會檢查那個緩衝區是不是屬於你,也不會檢查你是不是快把核心搞崩潰。它只會直接執行指令。

#include <stdio.h>
#include <stdlib.h>

// 第一幕:原始力量。你申請記憶體,你也要負責清理。
int main() {
    int count = 3;

    // 從 RAM 抓取原始位元組
    int *scores = (int *)malloc(count * sizeof(int));
    if (scores == NULL) return 1;

    scores[0] = 95;
    scores[1] = 88;
    scores[2] = 100;

    for (int i = 0; i < count; i++) {
        printf("Score %d: %d\n", i + 1, scores[i]);
    }

    // 忘了這一行?那塊 RAM 會一直漏到程序結束為止。
    free(scores);
    return 0;
}

優點與痛點

由於 C 幾乎以 1 比 1 的方式編譯成 CPU 指令,它成了現代運算的基礎。Linux 核心、Windows、macOS、Git、PostgreSQL,以及 Python 的 C 執行階段,全都建立在 C 之上。

  • 優點: 純粹的執行速度。沒有執行階段負擔。幾乎能在任何曾經製造過的處理器上執行。
  • 痛點: 忘了釋放記憶體?記憶體洩漏。 多讀了陣列外一個位元組?分段錯誤。

Segfault Meme


第二幕:Bjarne Stroustrup 的泰坦(C++,1985)

        [ Bjarne Stroustrup @ 貝爾實驗室 ]
                       │
                       ▼
    "You don't pay for what you don't use."
                       │
            ┌──────────┴──────────┐
            ▼                     ▼
       類別與 RAII        Unreal Engine
     零成本抽象         AAA 遊戲與瀏覽器

到了 80 年代中期,軟體規模已經超越了 C。

用程序式 C 撰寫分散式模擬、網路交換器或圖形桌面應用程式,意味著要管理成千上萬個彼此分離的結構與函式指標。程式碼庫變得太大,單靠鬆散的指標已經不夠用了。

Bjarne Stroustrup(同樣任職於貝爾實驗室)喜歡 Simula 的物件導向結構,但他需要 C 的速度。

他不想在抽象與原始速度之間二選一,所以他打造了 帶有類別的 C,後來成為 C++。

Bjarne Stroustrup

規則:「零成本抽象」

Stroustrup 堅守一個嚴格的設計原則:

「你沒用到的東西,就不用付出代價;進一步說,你用到的東西,也不可能用手寫得更好。」

C++ 引入了類別、繼承、運算子多載與樣板(templates)。關鍵是,它避免加入背景執行階段或垃圾回收器。

相反地,C++ 引入了 RAII(Resource Acquisition Is Initialization,資源取得即初始化)。概念很直接:物件擁有自己的資源,而當物件離開其作用域 { } 時,解構子會立即執行並清理記憶體。

#include <iostream>
#include <vector>

// 第二幕:零成本 RAII。
// 沒有 malloc。沒有 free。沒有手動指標帳務管理。
int main() {
    // std::vector 會自動在堆積上配置內部緩衝區
    std::vector<int> scores = {95, 88, 100};

    for (size_t i = 0; i < scores.size(); ++i) {
        std::cout << "Score " << (i + 1) << ": " << scores[i] << "\n";
    }

    // 不需要 free()。
    // 當 'scores' 離開這個結尾大括號時,它的解構子會清理記憶體。
    return 0;
}

優點與痛點

C++ 成為了任何每一毫秒都很重要的領域的業界標準:AAA 遊戲引擎(Unreal Engine)、瀏覽器渲染引擎(Chromium、WebKit)、高頻金融交易,以及航太軟體。

  • 優點: 具備高階物件導向模式,同時保有裸機等級的 C 效能。
  • 痛點: 語言本身非常龐大。樣板、多重繼承、移動語意之間,編譯器錯誤訊息有時像是一本古老的咒語書。

Confused Reading Code


第三幕:Anders Hejlsberg 的文藝復興(C#,2000)

        [ Anders Hejlsberg @ Microsoft ]
                       │
                       ▼
      "Make the developer happy and safe."
                       │
            ┌──────────┴──────────┐
            ▼                     ▼
      受管理執行階段(CLR)   現代 .NET 與雲端
      垃圾回收             Span<T> 與高效能

到了 90 年代末,Microsoft 遇到了一個 Java 問題。

Microsoft 當時正散布自己修改過的實作,名為 Visual J++,並加入了 Windows 專屬的掛鉤。Sun Microsystems 因違反合約而起訴他們。

訴訟之後,Microsoft 選擇和解、退出 Java,並決定從零開始打造自己的語言。

他們找上了 Anders Hejlsberg——Turbo Pascal 與 Delphi 背後的編譯器工程師——來領導「Project COOL」(C-like Object Oriented Language,類 C 物件導向語言)。

2000 年,這個專案以 C# 的名字正式推出。

Anders Hejlsberg

規則:「開發者生產力與安全性」

Anders 著重於降低開發摩擦:讓執行階段處理記憶體帳務,工程師就能專心交付功能。

C# 以乾淨的 C 風格語法,搭配 CLR(Common Language Runtime,共通語言執行階段) 與自動化的 Garbage Collector(GC,垃圾回收器)。記憶體會按需配置,未使用的物件則在背景中被回收。

隨著現代 C# 的最上層陳述式(top-level statements),經典的 class Program 和 static void Main 儀式感已經不見了:

// 第三幕:純粹的生產力(現代 C# 最上層陳述式)
// 沒有樣板類別包裝。直接寫程式碼。

var scores = new List<int> { 95, 88, 100 };

for (int i = 0; i < scores.Count; i++)
{
    Console.WriteLine($"Score {i + 1}: {scores[i]}");
}

// 零記憶體帳務管理。垃圾回收器會負責清理。

當速度很重要時,拿掉保護欄

很多開發者仍把 C# 看成慢吞吞的企業語言,主要是因為他們最近沒有深入了解它的內部機制。當你真的需要原始速度時,現代 C# 讓你可以拿掉保護欄:

  1. unsafe 關鍵字: 需要直接做指標運算嗎?你可以進入 unsafe 區塊,像寫 C 一樣直接操作記憶體位址。
  2. Span<T> 與 Memory<T>: 現代 C# 可以讓你切片陣列、字串與原生記憶體緩衝區,而且不用在堆積上配置任何位元組。

這個組合,是現代 .NET 在 TechEmpower Web 基準測試中,經常能和 Go、Rust 正面交鋒的重要原因之一。

優點與痛點

隨著開源的現代 .NET 普及,以及 Unity 遊戲引擎 的廣泛使用,C# 已經演變成最實用的通用語言之一。

  • 優點: 撰寫速度快、預設具備記憶體安全性,並且有現代化、跨平台的執行階段支援。
  • 痛點: 執行階段記憶體占用較小、冷啟動時需要 JIT 編譯暖機,而且如果你不小心配置了數百萬個暫時物件,偶爾還是會有 GC 延遲。

Jeremiah Johnson Nod

快速比較

以下是三者並排的比較:

特性 C(1972) C++(1985) C#(2000)
創作者 Dennis Ritchie Bjarne Stroustrup Anders Hejlsberg
記憶體 手動(malloc/free) 透過 RAII 自動管理(std::vector、智慧指標) 由垃圾回收器管理(加上 Span<T> 與 unsafe 指標)
安全性 低(容易當機) 如果使用現代 RAII 則高(否則很糟) 非常高(預設具備記憶體安全性)
速度 🚀 純硬體速度 🚀 純硬體速度 ⚡ 非常快(現代 .NET 已高度最佳化)
最適合 作業系統、驅動程式、小型晶片 遊戲引擎(Unreal)、瀏覽器、交易系統 Web API、企業雲端、Unity 遊戲

為什麼它們仍然在驅動世界

幾十年來,人們一直預言 C 系列語言會消亡:

  • 「Rust 會取代 C 和 C++。」
  • 「Go 會取代 C#。」
  • 「Python 會取代一切。」

然而到了 2026 年:

  • C 仍然驅動著 30 億支 Android 手機的核心,以及絕大多數雲端虛擬化主機。
  • C++ 驅動著 Unreal Engine 5、NVIDIA 的運算堆疊,以及本機 LLM 執行階段(llama.cpp)。
  • C# 驅動著數百萬個商業 Web 後端,並且透過 Unity 仍是獨立遊戲開發的預設引擎語言。

Dennis Ritchie 給了我們鋼鐵。
Bjarne Stroustrup 給了我們抽象。
Anders Hejlsberg 給了我們開發者體驗。

五十年後,他們其實已經不再彼此競爭——每一個人都只是拿下了技術堆疊中的不同層級。


換你說說:

如果明天你要打造一個全新的專案,而且只能從這三者中選一個,你會選哪個:C、C++,還是 C#?

把你的選擇留在下方留言吧!👇


原文出處:https://dev.to/devengers/the-c-trilogy-how-dennis-ritchie-bjarne-stroustrup-and-anders-hejlsberg-built-the-modern-world-1onp


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
boluoji
📝26   💬3   ❤️6
595
🥈
站長阿川
📝4   💬2   ❤️2
193
🥉
mike
1
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登