LWN 近期文章指出,C 編譯器直到最近才新增尾呼叫優化(TCO)功能,此發現挑戰了系統程式設計師長期認為 TCO 已是標準功能的假設。這突顯了 C 的呼叫慣例與 ML 或 JavaScript 等功能語言之間長期存在的差距,影響開發者在 C 中編寫遞迴程式碼的方式,因為他們不能再依賴編譯器自動防止尾遞迴函數中的堆疊溢位。延遲的原因在於 C 的呼叫慣例規定由呼叫端而非被呼叫端負責清理堆疊,導致早期 C 編譯器難以高效實現 TCO,與自 1980 年代起就為尾呼叫設計的語言形成對比。
事件背景
尾呼叫優化是一種編譯器技術,當函式呼叫是函式中的最後一個操作時,會重複使用目前的堆疊框架,以防止深度遞迴演算法中的堆疊溢位錯誤並提升效能。在 Scheme 或 Haskell 等語言中,TCO 是保證的,而在 C 中,它歷史上一直是依賴編譯器實作的可選優化。
社群觀察
社群成員討論了 TCO 在 C 中是否真的必要,有些人認為迴圈更自然,且 TCO 主要對沒有可變變數的功能語言有用。另一些人對其遲遲才導入感到驚訝,指出 ML 等語言自 1980 年代就已支援,而有一位使用者提到 JavaScript 也曾經歷過新增後又移除 TCO 的過程。



