JavaScript 與 TypeScript 的高效執行環境 Bun,近期在技術底層發生了重大變革。其創始人 Jarred Sumner 宣布,Bun 已將原先使用 Zig 語言編寫的 535,496 行代碼全面重寫為 Rust。這次遷移的核心目標在於解決長期困擾的記憶體安全問題,並利用 Rust 強大的編譯器特性來消除 Bug。值得關注的是,這項工程原本預計需要小型工程團隊耗時一年才能完成,但透過大規模 AI 自動化流程,最終在四個月內地達成目標。
記憶體安全與語言選擇的背景
在系統底層開發中,記憶體管理是最容易出錯的環節。Bun 原先採用的 Zig 語言雖然高效,但要求開發者手動管理記憶體。這導致 Bun 在開發過程中出現了大量典型的記憶體漏洞,例如 Use-after-free(使用已釋放的記憶體)、Double-free(重複釋放記憶體)以及在錯誤處理路徑中遺漏釋放記憶體(Memory Leak)。
為了根除這些問題,Bun 選擇遷移至 Rust。Rust 的核心競爭力在於其借用檢查器(Borrow Checker)與 RAII(資源獲取即初始化)機制,能讓編譯器在編譯階段就強制執行記憶體安全規則。對於開發者而言,將記憶體管理從依賴開發者的風格指南(Style Guide)轉移到由編譯器強制執行的錯誤檢查,能大幅縮短回饋循環並提升程式碼的穩定性。
AI 自動化重寫的實作路徑
面對超過 50 萬行代碼的龐大體量,傳統的人力重寫意味著必須凍結所有新功能開發與安全性修補。為了突破這個限制,Sumner 採用了一套基於 AI 代理(Agentic Workflow)的自動化移植方案,主要利用 Anthropic 的 Claude Fable 5 模型。
這套流程並非簡單的逐行翻譯,而是一套複雜的工業化管線。首先,團隊建立了兩份關鍵的指引文件:PORTING.md 定義了 Zig 與 Rust 之間的類型與模式映射,而 LIFETIMES.tsv 則詳細描述了代碼庫中每個結構體欄位的生命週期。
在實際執行階段,系統將任務分發至 64 個並行運作的 Claude 實例。其運作邏輯採取對抗性設計:由一個實作代理(Implementer Agent)負責將 Zig 轉譯為 Rust 碼,隨後由兩個獨立的審查代理(Reviewer Agents)在隔離的環境中檢查差異並尋找 Bug。如果審查代理發現問題,會交由修復代理(Fixer Agent)處理,而實作代理則根據錯誤反饋優化整個實作流程,而非僅僅手動修正單一代碼片段。在高峰期,該系統每分鐘能產生約 1,300 行代碼,每小時提交高達 695 次 Commit。
驗證機制與實務成效
為了確保 AI 生成的代碼不會引入災難性的回歸,Bun 利用其現有的 TypeScript 測試套件進行驗證。由於測試套件與執行環境的底層語言解耦,這使得 Bun 能在不改變測試邏輯的情況下,對超過一百萬個斷言(Assertions)進行驗證。
儘管自動化程度極高,但機械式轉譯仍帶來了 19 個細微的語義回歸問題,這些問題源於 Zig 與 Rust 在語法上的相似性導致的誤判。為此,團隊後續導入了 11 輪的 AI 安全審查以及 24 小時不間斷的覆蓋率導向模糊測試(Coverage-guided Fuzzing),以確保解析器的正確性。
這次遷移在效能與穩定性上帶來了顯著提升。在 Bun v1.4.0 版本中,原先在 v1.3.14 存在且長期未解的 128 個 Bug 被順利解決。最明顯的改善在於記憶體洩漏:在進行 2,000 次連續的打包操作測試時,Rust 版本的記憶體使用量穩定在 609 MB,而原先的 Zig 版本則會一路攀升至 6.7 GB 以上。此外,HTTP 吞吐量也提升了 2% 至 5%。
爭議、限制與產業意義
儘管成效顯著,這次大規模 AI 重寫也引發了開發社群的激烈討論。Zig 的創始人 Andrew Kelley 對此持批評態度,他認為將 Bug 的消除歸功於語言特性而非工程投入是一種誤導。他質疑,如果原有的測試套件無法在 Zig 版本中捕捉到那些 Bug,為何能讓開發者相信同樣的測試套件足以驗證一百萬行由 AI 生成且未經人工逐行審查的代碼。
從軟體工程的角度來看,Bun 的這次嘗試將其推向了工業界的試金石地位。許多開發者關注的是,這種由 LLM 大規模生成的代碼庫在長期的維護週期中,是否能保持可維護性,還是會演變成難以掌控的技術債。
這次工程的成本高昂,僅 API Token 的費用就達到了 16.5 萬美元,涉及數十億個輸入 Token。然而,與聘請三名頂尖工程師耗時一年且必須停止功能開發的成本相比,這種以金錢換取時間與安全性的策略,為未來大型系統的語言遷移提供了一種全新的可能性。
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。