Pgrust的構建:四次用AI將Postgres重寫為Rust的嘗試
在花費10萬美元后,團隊透過四次嘗試成功用AI將Postgres重寫為Rust,生成了180萬行慣用Rust程式碼。文章詳細描述了每次嘗試的方法、教訓,以及最終版本pgrust的效能優勢。
在過去的三個月裡,我與朋友Jason Seibel合作構建了pgrust,目標是透過AI打造一個更好的Postgres版本。由於Postgres用C語言編寫,AI在修改時容易出錯,因此我們首先將其重寫為Rust,以便AI更安全地新增新功能。這一觀點正在被證實——正在開發的第五版pgrust在事務負載上比Postgres更快,分析查詢效能與Clickhouse相當,而Clickhouse通常比Postgres快數百倍。
我們共進行了四次嘗試,總花費約10萬美元。第一次嘗試pgrust-og採用逐個功能移植的方法。首先構建核心子系統(解析器、計劃器、執行器等),然後利用多個Codex代理並行實現數百個功能。測試透過率達到了96%,但由於計劃器的內部表示與Postgres存在細微差異——例如在Postgres中一個簡單的SELECT查詢被表示為單個節點(SeqScan),而在Rust中被表示為三個節點(Projection、Filter、SeqScan),並且表引用方式也不同——導致“器官移植失敗”,最終無法修復。這次嘗試消耗了8個Codex賬戶一個月的費用,約1600美元。
第二次嘗試使用c2rust將Postgres的C程式碼直接轉譯為530萬行不安全Rust。轉譯後的程式碼完全透過了測試套件,甚至與Postgres擴充套件ABI相容。但將其重構為安全Rust極為困難:每個函式都使用指標,要轉換一個函式必須同時修改其呼叫者和被呼叫者的型別和邏輯,導致修改一個函式可能涉及數百個函式。嘗試增量方法(如為每個函式建立安全和不安全兩個版本)均不奏效。
第三次嘗試pgrust-idiomatic計劃逐crate重寫c2rust的輸出(約1000個crate)。受Jarred Sumner將Bun從Zig逐檔案重寫為Rust的啟發,我們開始了這項工作。然而,由於需要重寫所有crate才能執行測試,風險極高,且效率問題依然存在。
最終,第四次嘗試透過同時執行多達40個並行子代理,實現了檔案級別的重寫,生成了180萬行慣用Rust程式碼。關鍵教訓包括:重寫遺留系統時應選擇檔案級而非功能級並行;使用CI處理構建負載;確保中間表示與原始系統等價。最終版本pgrust不僅證明了AI輔助重寫的可行性,也為未來AI安全擴充套件Postgres奠定了基礎。