今天地球上幾乎每一套正在執行的軟體,都能追溯到三個人正試圖解決同一個頭痛問題:如何在不小心損毀記憶體的情況下,撰寫大型且複雜的程式。
如果你今天開機一台筆電、打開瀏覽器、玩一款 3D 遊戲,或刷一張信用卡,你其實都在執行由 Dennis Ritchie、Bjarne Stroustrup 和 Anders Hejlsberg 塑造的程式碼。
他們一起打造了程式設計史上最著名的三部曲:C、C++ 和 C#。
接下來,我們來看看為什麼這三種語言會誕生、塑造它們的企業訴訟,以及為什麼這三者至今仍然在現代基礎架構中運作。
[ Dennis Ritchie @ 貝爾實驗室 ]
│
▼
"Trust the programmer."
│
┌───────┴───────┐
▼ ▼
原始指標 Linux 與 Windows
零安全性 在所有裝置上執行
1970 年代初期在貝爾實驗室,撰寫作業系統就等於撰寫原始組合語言。
如果你為某台機器寫了程式,而實驗室下個月又進了一台新電腦,你幾乎得把每一行都從頭重寫。
Dennis Ritchie 想要的是更實用的東西:一種讀起來像結構化程式碼、卻能直接對應到硬體暫存器的語言。
所以他打造了 C。

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 之上。

[ 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++。

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)、高頻金融交易,以及航太軟體。

[ 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 著重於降低開發摩擦:讓執行階段處理記憶體帳務,工程師就能專心交付功能。
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# 讓你可以拿掉保護欄:
unsafe 關鍵字: 需要直接做指標運算嗎?你可以進入 unsafe 區塊,像寫 C 一樣直接操作記憶體位址。Span<T> 與 Memory<T>: 現代 C# 可以讓你切片陣列、字串與原生記憶體緩衝區,而且不用在堆積上配置任何位元組。這個組合,是現代 .NET 在 TechEmpower Web 基準測試中,經常能和 Go、Rust 正面交鋒的重要原因之一。
隨著開源的現代 .NET 普及,以及 Unity 遊戲引擎 的廣泛使用,C# 已經演變成最實用的通用語言之一。

以下是三者並排的比較:
| 特性 | 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 系列語言會消亡:
然而到了 2026 年:
llama.cpp)。Dennis Ritchie 給了我們鋼鐵。
Bjarne Stroustrup 給了我們抽象。
Anders Hejlsberg 給了我們開發者體驗。
五十年後,他們其實已經不再彼此競爭——每一個人都只是拿下了技術堆疊中的不同層級。
如果明天你要打造一個全新的專案,而且只能從這三者中選一個,你會選哪個:C、C++,還是 C#?
把你的選擇留在下方留言吧!👇