Valen 語言開發者發布了關於其新型「彈性借用檢查器」(Flexible Borrow Checker)的技術文章,該系統基於 Nick Smith 設計的「群組借用」(Group Borrowing)概念。此方法旨在解決記憶體安全領域的長期挑戰,試圖結合 Rust 借用檢查的強大能力與引用計數或垃圾回收的靈活性。核心機制在於讓編譯器記住引用的指向(path),從而將傳統借用檢查中嚴格的「共享或可變」(shared-xor-mutable)限制,放寬為僅禁止「使用釋放後記憶體」(use-after-free)錯誤。這使得編譯器能在編譯階段捕捉記憶體錯誤,同時允許程式中存在多個指向同一物件的可變引用,並支援透過這些引用進行寫入操作。文章指出,這種方法能處理許多傳統借用檢查器難以處理的模式,例如多個局部變數指向同一物件並進行寫入、函數參數指向同一物件的不同部分並進行寫入、以及實作類似 ScopeGuard 的「回滾」結構等。此外,Valen 的實作結合了 Vale 語言的世代引用(generational references)與區域借用(region borrowing)技術,並強調其設計允許 Valen 程式碼與 Rust 程式碼互通。開發者提到,群組借用的概念已影響 Google 的 Carbon 語言、Ante、Plecra、Zeta 及 Fang 等多個語言專案。文章也提及,為了清晰起見,文中使用的語法糖(如自動解引用、直接索引結構體、從群組推斷類型)預計於 11 月推出,目前編譯器仍需手動解引用及標註類型。

事件背景

群組借用(Group Borrowing)最初由 Nick Smith 為 Mojo 語言設計,但未被採用。隨後該概念透過文章傳播,被 Google Carbon、Ante、Plecra、Zeta 和 Fang 等語言專案採納或參考。傳統借用檢查器(如 Rust)執行「共享或可變」規則,即若持有物件的引用,則其他人不能修改該物件,這與 C++、引用計數或垃圾回收允許持有引用同時修改物件的需求存在衝突。Valen 的實作結合了 Vale 語言的技術,但兩者有顯著差異:Valen 採用群組借用而非區域借用,採用標準世代引用而非機率性世代引用,並增加了 Rust 互通、Rc 和編譯期計算(comptime)功能,但移除了 Vale 的完美可重播性(perfect replayability)和無畏 FFI(fearless FFI)。兩者皆使用線性類型。

社群觀察

社群對該技術反應不一。有評論認為這對於程式碼驅動且靜態知識完整的系統(如某些渲染場景)很有用,但指出以遊戲開發中的「世界」和「實體」為例可能具誤導性,因為現代遊戲開發多轉向數據驅動。另一評論指出,「共享或可變」限制並非缺陷,而是防止並發錯誤的特性,是 Rust「無畏並發」的來源。還有評論建議將「群組借用」稱為「路徑借用」更準確,並質疑為何需要「in」關鍵字來進行子借用,認為使用「&」符號會更一致。另有評論提到 Mojo 語言的 origin 概念可能已涵蓋部分語義,並提供了相關程式碼範例。最後,有評論詢問關於不可變性的保證,指出 Rust 中共享引用保證了無數據競爭,有利於最佳化器分析,而 Valen 的靈活性是否會犧牲這些保證。