C 語言被譽為「編程語言之母」,統治系統級開發半個世紀。本文梳理 C 語言從字母起源、BCPL/B 語言演變、K&R C、ANSI C、C99、C11、C17 至最新 C23 標準的完整脈絡,並總結其核心特性、優缺點與現代應用場景。
字母 C 起源於古埃及象形文字的「投擲棒」符號,經閃族 gimel、希臘 gamma、伊特魯里亞語演變,羅馬人將其圓滑化用於 /k/ 音,後加橫劃成 G 區分 /g/ 音。計算機科學中,C 代表十六進制 12、首個硬盤分區(C:)、光速、庫侖、維生素 C 等,承載豐富符號意義。
| 年份 | 里程碑 | 關鍵特性 |
|---|---|---|
| 1967 | BCPL (Martin Richards) | CPL 簡化版,無類型系統,詞法簡潔 |
| 1970 | B 語言 (Ken Thompson) | BCPL 進一步簡化,首創 ++/--,編寫首個 UNIX |
| 1972 | C 語言誕生 (Dennis Ritchie) | 在 B 基礎上加入類型、結構體、指針,PDP-11 上重寫 UNIX |
| 1978 | K&R C 《The C Programming Language》 | 事實標準,函數聲明無參數類型,long float 等歷史遺留 |
| 1989/1990 | ANSI C / ISO C90 (C89) | 首個國際標準,函數原型、void*、const、標準庫規範 |
| 1995 | NA1 (規範增補) | 多字節字符、stdint.h 前身、本地化增強 |
| 1999 | C99 (ISO/IEC 9899:1999) | 重大更新://註釋、inline、restrict、VLA、stdint.h/inttypes.h/stdbool.h、long long、_Complex、指定初始化器、snprintf、// 等 |
| 2011 | C11 (ISO/IEC 9899:2011) | 多線程 (<threads.h>)、原子操作 (<stdatomic.h>)、_Generic、_Static_assert、_Alignas/alignof、_Noreturn、Unicode 增強、gets 移除、邊界檢查接口 (Annex K) |
| 2017/2018 | C17/C18 | 純錯誤修正版,無新特性 |
| 2023/2024 | C23 (ISO/IEC 9899:2024) | auto 類型推導、typeof、#embed、#elifdef、[[attributes]]、nullptr、bool/true/false 為關鍵字、bitint、decimal 浮點、strdup 入標、memccpy 等 |
if/switch/for/while/do);| 優點 | 缺點/挑戰 |
|---|---|
| 執行效率極高,接近匯編 | 手動內存管理易導致洩漏、越界、UAF、雙重釋放 |
| 直接操作硬件,無運行時開銷 | 無命名空間/模塊系統(C23 仍無),大項目符號衝突依賴前綴 |
| 生態成熟,編譯器/工具鏈最完善 | 字符串處理原始,無內置高級容器/算法 |
| 標準穩定,代碼 30 年不變仍能編譯 | 並發原語底層,易出數據競爭/死鎖 |
| 互操作性最強,所有語言都能調用 C ABI | 未定義行為 (UB) 多,優化器可能「誤刪」看似正常代碼 |