Hacktical C:一本實用指南引發關於 C 語言在現代程式設計中角色的爭論

BigGo Editorial Team
Hacktical C:一本實用指南引發關於 C 語言在現代程式設計中角色的爭論

在一個由記憶體安全語言和高階抽象主導的時代,一本名為 Hacktical C 的新開源書籍出現了,它將自己定位為 C 程式語言的實用駭客指南。這本以開放許可釋出的書籍在程式設計社群內引發了關於 C 語言的相關性、安全性以及在現代程式設計生態系統中地位的激烈討論。

C 作為可移植組合語言 - 神話還是現實?

社群討論中最具爭議的一點圍繞著作者聲稱 C 語言作為一種基本可移植的組合語言,處於獨特的地位。這一描述遭到了許多開發者的強烈反對,他們認為按照現代標準,C 遠非真正的低階語言。

「當你的電腦是 PDP-11 時,它才是這樣;否則,它只是像其他語言一樣的高階系統語言。」

幾位評論者指出,C 實際上建立了一個抽象機器,並不直接對映到現代硬體功能。當編寫 C 程式碼時,開發者是在為 C 規範描述的虛擬機器而非實際硬體程式設計。這種抽象包括物理硬體中不存在的行為,如有符號溢位和記憶體初始化跟蹤的未定義行為。此外,批評者指出,C 缺乏對過去幾十年已成為標準的許多硬體特性的原生支援,包括對子位元組值的適當位操作和直觀的 SIMD 操作。

記憶體安全與自由責任之爭

作者認為 C 不會努力阻止你犯錯,並提供了伴隨責任的自由,這一觀點引發了關於這種哲學在現實世界中影響的實質性討論。雖然一些評論者欣賞這種方法,但許多人質疑記憶體不安全語言是否是現代軟體開發的可行選擇。

批評者認為,記憶體安全問題不僅僅是程式設計師技能的問題,而是代表了系統性漏洞,無論開發者專業知識如何,這些漏洞仍會產生安全漏洞。他們指出,無論個人程式設計能力如何高超,都無法顯著減少 C 程式中由記憶體安全漏洞引起的 CVE 數量。這場辯論還延伸到了 C 提供的靈活性是否值得安全和維護成本,特別是當具有不安全逃逸機制的現代語言(如 Rust)可以同時提供安全性和效能時。

實用 C 技術:聰明的技巧還是危險的模式?

這本書展示了各種 C 程式設計技術,其中一些既引發了讚賞也引起了擔憂。一個特別受到關注的例子是使用 __LINE__ 宏以創造性方式實現的協程:

Hacktical C 中的關鍵主題

* 宏
* 定點算術
* 侵入式雙向連結串列
* 輕量級併發任務
* 可組合記憶體分配器
* 向量
* 異常
* 有序集合和對映
* 動態編譯
* 可擴充套件流
* 結構化日誌

編譯器對 C 語言的支援

| 編譯器 | C17 | C11 | VLAs | C23 |
|----------|-----|-----|------|-----|
| GCC      | 支援 | 支援 | 支援  | 支援(預設) |
| Clang    | 支援 | 支援 | 支援  | 部分支援 |
| MSVC     | 支援(自2020年起) | 支援 | 不支援(從未計劃) | 路線圖不明確 |

#define hc_task_yield(task)   
  do {     
    task->state = __LINE__;   
    return;     
    case __LINE__:;           
  } while (0)

雖然一些評論者認為這種技術既狡猾又聰明,但其他人則指出了替代實現,並討論了使用 GNU 擴充套件與標準 C 的優缺點。這突顯了該書專注於解決 C 語言問題的實用、有時非常規的方法。

Microsoft 與 C 的關係

書中聲稱 Microsoft 不幸選擇長期忽視 C,其編譯器遠遠落後於其他競爭對手,這引發了關於 Microsoft 當前 C 支援狀態的討論。評論者澄清說,雖然 Microsoft 歷來優先考慮 C++ 而非 C,但近年來已有所改進。2020年,Microsoft 添加了對 C11 和 C17 標準的支援,儘管一些功能如可變長度陣列(VLAs)仍不受支援,且沒有實施計劃。考慮到公司越來越關注記憶體安全語言作為其安全計劃的一部分,社群對 Microsoft 的 C23 支援路線圖仍不確定。

在一個越來越被記憶體安全和現代語言特性討論所主導的環境中,Hacktical C 既是 C 程式設計師的實用資源,也是關於程式語言選擇的哲學宣告。無論被視為有價值的技術集合還是對日益受到質疑的系統程式設計方法的辯護,這本書無疑成功地引發了關於 C 在當今程式設計世界中地位的深思熟慮的討論。

參考:Hacktical C