安全對控制的爭論(safety-versus-control debate)
系統程式設計坐落在一個沒有乾淨贏家的真實張力上,而這個領域正積極地為它爭論。一邊是控制:像 C 與 C++ 這樣的語言給你對記憶體與硬體直接、無防護的存取——你精確決定位元組如何佈局、記憶體何時被釋放、機器做什麼——這既強大又快速,但也正是為何同樣這些語言成了數十年記憶體安全漏洞的源頭。另一邊是安全:那些藉由建構就防範整類臭蟲的語言與工具,代價是放掉一些控制、一些摩擦,或一些假設。安全對控制的爭論,就是關於如何兼得兩者、以及在無法兼得時該捨棄什麼的持續論辯。
具體而言,這場爭論貫穿了大多數前沿主題。Rust 的核心賭注是你能同時擁有低階控制與記憶體安全:它的借用檢查器在靜態上禁止釋放後使用與資料競爭,且不需垃圾回收——但代價是更陡的學習曲線、與編譯器真刀真槍的搏鬥,以及一個保證會失效的 unsafe 逃生口。垃圾回收的語言以放棄對記憶體時機的精確控制來換取安全,這在核心或硬即時迴圈裡往往無法接受。硬體途徑(能力、飛地)與形式化驗證各從不同角度追求安全,各有自己的代價與假設。誠實的框定是:「安全」與「又快又低階」歷來彼此拉扯,而整個前沿就是在尋找讓它們改為同向拉動的設計。
它之所以重要,是因為答案塑造了接下來數十年的作業系統、驅動程式與基礎設施會以什麼撰寫,而這場爭論是真實且未底定的——不是一個有明確勝者、已解決的問題。要老實說:沒有任何語言能以零成本給你完全的安全與完全的控制;Rust 令人印象深刻地挪移了這個取捨,卻沒有廢除它(unsafe 程式碼與 FFI 仍可能造成未定義行為,而即使是安全的 Rust 也擋不住邏輯臭蟲、洩漏或死結);而鑑於既有的數十億行程式碼,C 短期內不會消失。對任何把某一邊賣成「顯然正確」的人,請抱持懷疑——價值在於精確理解這個取捨,而非選邊站隊。
C / C++ : 對記憶體 + 硬體最大的控制 -> 但數十年的記憶體安全 CVE Rust : 低階控制 + 編譯期安全 -> 但一道學習峭壁 + 一個 `unsafe` 逃生口 GC 語言: 強固的安全 -> 但你放棄了對記憶體時機的精確控制 => 沒有選項能以零成本兼得完全的安全「與」完全的控制;前沿在尋找最佳的取捨
安全與低階控制歷來彼此取捨;前沿尋找減輕這個取捨的設計,但沒有一個能廢除它。
這確實尚未底定,不是一場有勝者、已解決的爭論。沒有語言能免費給你完全的安全與完全的控制:Rust 挪移了這個取捨卻沒廢除它(unsafe 程式碼與 FFI 仍可能造成未定義行為;即使安全的 Rust 也容許邏輯臭蟲、洩漏與死結),而 C 龐大的既有程式庫不會消失。對任何把某一邊賣成顯然正確的人,請抱持懷疑。