Salt 系統程式語言:Z3 定理證明與 MLIR 產生碼
Salt 系統程式語言:Z3 定理證明與 MLIR 產生碼
Salt 直接將 Z3 定理證明整合到編譯器中
Salt 是一種系統程式語言,旨在在不需要垃圾回收器的執行時開銷或借用檢查器的複雜性的情況下,提供關於記憶體安全與函式合約的數學確定性。透過將微軟研究院的 Z3 SMT 求解器嵌入編譯流程,Salt 讓開發者能夠定義 requires() 前置條件與 ensures() 後置條件,並在建置時驗證它們。
當 Z3 求解器能證明條件成立時,對應的執行時檢查會被完全省略,該檢查不會產生任何指令。若 Z3 發現違反,編譯器會回報具體的反例。若求解器逾時(每個義務的上限為 100 ms),編譯器會退回並產生安全的執行時檢查。
高效能架構與 MLIR 產生碼
Salt 透過使用 MLIR(多層次中間表示),與 TensorFlow 與 PyTorch 相同的基礎設施,達到與 clang -O3 相當的效能。
自動迴圈平鋪
透過 MLIR 的 affine 方言,Salt 實作自動迴圈平鋪,無需手動調整平鋪大小。這使得以計算為主的工作(例如一般矩陣乘法)能與 C 的效能持平。在 Basalt Llama 2 推論引擎——一個 600 行 Salt 實作——中,矩陣乘法透過 affine 最適化器進行平鋪,以維持高效率。
競技場記憶體模型
Salt 用基於競技場的記憶體模型取代傳統的垃圾回收與借用檢查。所有配置都發生在特定區域內,整個區域會一次釋放。編譯器在靜態階段驗證不會有引用超出其競技場的生命週期,從而不需要手動 free() 呼叫或複雜的生命週期註解。
真實案例與基準測試
此語言已被用於構建多個高效能系統,展示了其在不同領域的多樣性:
- KeuOS:一個完全用 Salt 從頭編寫的微核心,能在 x86 硬體上開機。它具備 16 核心 SMP、Chase‑Lev 工作竊取與零陷阱 socket API。基準測試顯示空的系統呼叫只需 102 個週期(比 Linux 快 7.4 倍),IPC ping‑pong 為 297 個週期。
- Lettuce:相容於 Redis 的記憶體資料庫,僅有 567 行 Salt 程式碼。它使用零拷貝的 RESP 解析器與 kqueue 事件迴圈,在測試的 1–100 客戶端併發層級上均優於 Redis。
- Basalt:一個 Llama 2 推論引擎,所有計算核心都附帶 Z3 證明,保證陣列存取不會越界。
- FACET:2D 渲染引擎,每個像素寫入都經過 Z3 驗證在畫面緩衝區內,達到 457 fps。
在 Apple M4(macOS ARM64)上收集的效能資料顯示,Salt 在 21 個演算法基準中有 19 個與 C(clang -O3)持平或更快。對於大量配置的工作負載,如 HashMap 與 LRU 快取,因競技場配置模型而獲得 2‑10 倍的效能提升。
語言易用性與工具鏈
Salt 引入多項語法特性以減少樣板程式碼並提升可讀性:
- 管道運算子:
|>運算子允許資料左到右流動,而|?>會傳播錯誤。這取代了 C 中冗長的錯誤處理模式或 Rust 中的 trait‑bound 仪式。 - F‑字串:型別安全的字串格式化,能嵌入表達式且不需要堆配置或格式說明子。
- 套件管理:
sp工具負責專案建立、建置與相依管理。它使用內容位址快取,確保只要原始碼未變更,就不會重新建置。安全合約會跨套件邊界驗證;若某個函式庫要求特定條件,編譯器會在下游套件的每個呼叫點驗證該條件。
技術限制與社群背景
雖然 Salt 展示了顯著的效能與驗證能力,作者仍指出它目前屬於研究品質的專案,而非可直接投入生產的語言。標準函式庫尚未完整,且 Z3 對字串與量詞的支援仍不完整。此外,來自 Z3 階段的錯誤訊息有時會相當晦澀。
社群討論中常將其與其他形式驗證語言作比較。例如,SPARK(Ada 的子集)自 1980 年代起即使用 Z3 於安全關鍵的航空與防務專案;Verus 則在 Rust 上加入 Z3 以達成類似的驗證目標。批評者指出,目前的文件與語言規範缺乏一致性,且專案缺少除主要開發者之外的廣大 beta 測試者社群。
摘要:
Salt 是一種系統程式語言,將 Z3 SMT 求解器直接整合到編譯器中,以提供數學驗證的安全合約,零執行時成本,且效能與 clang -O3 相當。
標題: Salt 系統程式語言:Z3 定理證明與 MLIR 產生碼