The author argues that the current C-based ABI used by Rust is inefficient for passing complex types and proposes a new register-based calling convention inspired by Go to optimize performance.
我們值得擁有的 Rust 呼叫約定
Hacker News
3 天前
AI 生成摘要
我認為目前 Rust 採用的 C ABI 在處理複雜類型的傳遞時效率不彰且缺乏想像力,因此我提議參考 Go 語言的暫存器 ABI,為 Rust 設計一套更高效的呼叫約定。
本文探討了 Rust 語言在函數調用慣例(Calling Convention)上的現狀與改進空間。作者 mcyoung 指出,目前的 Rust 為了相容性與穩定性,過度保守地沿用了 C ABI 的邏輯,導致在處理複雜類型(如結構體或陣列)時,無法有效利用暫存器,進而產生低效的組合語言代碼。作者提議引入一種新的內部調用慣例,透過更激進的暫存器分配策略來提升效能。
社群觀點
針對作者提出的改進方案,Hacker News 社群展開了多維度的討論。部分技術評論者對「調用慣例」這一術語的定義提出了質疑。有觀點認為,作者所提倡的其實並非傳統意義上標準化、跨語言的 ABI,而是一種針對特定函數進行的編譯優化手段。這種做法介於「內聯優化」與「固定調用慣例」之間,旨在針對非外部可見的函數進行參數傳遞的微調。評論者指出,如果編譯器能在連結時優化(LTO)階段根據函數體特徵動態決定參數傳遞方式,這更像是一種靜態優化技術,而非對 C ABI 的直接替代方案。
在歷史脈絡方面,社群成員回顧了 Rust 早期發展的關鍵轉折。有討論提到 Rust 在 1.0 版本之前曾支持綠色線程(Green Threads),這對當時的內存佈局與調用方式產生過深遠影響。然而,社群普遍達成共識,認為 Rust 最終移除綠色線程運行時是正確的決定。這項變革讓 Rust 能夠擺脫厚重的運行時負擔,從而具備與 C 和 C++ 在系統編程領域直接競爭的實力。若保留該特性,Rust 可能會淪為另一種語法類似 C 但底層邏輯接近 OCaml 的語言,失去其作為底層系統語言的獨特性。
此外,關於優化效益的爭論也十分激烈。一些資深開發者指出,現代編譯器如 GCC 在處理非外部可見函數時,其實已經會在 LTO 模式下進行類似的優化。如果 Rust 目前尚未普及這種做法,或許是因為實際效能提升並不如預期中顯著,或者是在調試便利性與編譯速度之間取得了某種平衡。反對意見認為,批評 C ABI 雖然在學術上站得住腳,但 C ABI 的價值在於其穩定性與通用性,任何試圖取代它的方案若無法解決跨語言調用的複雜性,都難以稱之為真正的「解決方案」。