接連被開源專案curl、Prisma棄用,Rust語言遭遇水逆,網友:從狂熱粉到後悔莫及

机器之心發表於2025-01-05
一時之間,Rust 程式語言陷入到了接連被棄用的窘境。

作為一門系統程式語言,Rust 專注於安全,尤其是併發安全。它支援函式式和命令式以及泛型等程式設計正規化的多正規化語言,在語法上和 C、C++ 類似。
圖片
圖源:https://x.com/ThePrimeagen/status/1875592777440084416

就在剛剛過去的 12 月底,知名開源專案 curl 的創始人 Daniel Stenberg 宣佈:將放棄支援基於 Rust 編寫的 Hyper HTTP 後端,並徹底移除相關程式碼。此舉引起了開發者社群的廣泛關注。

旅程即將結束,實驗結束了。我們努力過,但還是失敗了。
圖片
2020 年,Stenberg 開始在 curl 中新增對另一種 HTTP 後端的支援,它使用了基於 Rust 編寫的庫,被稱為 hyper。他的想法是引入一種替代的 HTTP 內部實現,從而可以讓 curl/libcurl 使用它來代替本機實現。目標是藉助 Rust 的記憶體安全性,為 curl 使用者提供一個更安全的 HTTP 後端實現。

最初的工作得到了 ISRG 的慷慨贊助,它是「Let’s Encrypt」等出色工作的背後組織。期間 Stenberg 與 hyper 首席開發人員 Sean McArthur 密切合作,並取得了很大進展。到目前為止,Stenberg 已經在 curl 中以 EXPERIMENTAL 為標籤提供了 hyper 支援,希望吸引使用者的興趣並激發他們的實驗精神。

Stenberg 表示,他們已經完成了 95% 的工作,而且幾乎整個測試套件都以相同的方式執行,無論構建 curl 時使用哪個後端。然而,正是那最後的百分之幾卻變成了最大的阻力,最終導致了專案失敗、放棄並全部撤出。

為什麼呢?總結起來,主要有以下兩方面原因。

一方面,幾乎沒人有這樣的需求,curl 的使用者對 hyper 沒有興趣;現有的 hyper 使用者也不關心它是否相容 curl。

另一方面,libcurl 庫是用 C 編寫的,hyper 是用 rust 編寫的,兩者之間需要一個 C 粘合層。這就需要同時精通 C 和 Rust 語言的開發者來深入研究相關的架構和協議,來推動專案進展。現實卻是缺乏這樣的開發者。

因此,由於預計無法在短中期內完成 hpyer 工作,並且保留程式碼的成本實在太高,只能透過削減這些程式碼來提供靈活性並降低複雜性。

雖然 hyper 的實驗本身失敗了,Stenberg 認為他們從中吸取了一些教訓,並在過程中改進了 curl。其實在 2020 年開始 hyper 專案的時候,Rust 語言本身並沒有準備好。隨著時間的推移,Rust 現在已經有所改進,成為一種更好的語言,並可以為類似 hyper 的專案提供更好的服務。

另外,在拋棄 hyper 之後,curl 仍然有兩個 Rust 編寫的實驗性後端支援,分別是 rustls(用於 TLS)和 uiche(用於 QUIC 和 HTTP/3)。這兩個後端在 crul 中使用了更好的內部 API,並以更乾淨的方式掛接到 libcurl 中,因而相較於 hyper 更易於支援,負擔也更小。

目前,hyper 的超級後端程式碼已從 git 中刪除,並且 2025 年 2 月釋出的 curl 8.12.0 版本中將不會留下任何痕跡。

不過,雖然 hpyer 被移除了,Stenberg 對未來引入 Rust 或其他語言編寫的安全後端持開放態度。未來會採用一些不一樣的做法,畢竟與 2020 年開始 hyper 時相比,他們現在擁有了更好的內部架構。

無獨有偶,在 12 月初,另一個開源資料庫工具鏈專案 Prisma 也表態將從 Rust 遷移至 TypeScript,以追求更好的外掛和擴充套件生態。

宣告中寫道:Prisma 的架構歷來限制社群貢獻,其核心功能(例如查詢解析、驗證和執行)由 Rust 引擎管理,而這對於專注於 TypeScript 的社群來說是不透明的。因此決定將 Prisma 的核心邏輯從 Rust 遷移到 TypeScript,並重新設計 ORM,以使定製和擴充套件更容易。
圖片
近幾年 Rust 語言正在強勢崛起,在一些程式語言排行榜中的排名一直在攀升,比如 2024 IEEE Top 程式語言榜單中,Rust 的排名就很靠前。另外,用 Rust 取代 C 和 C++ 的呼聲也很高。
圖片
雖然 Rust 很強大且在安全性方面獨樹一幟,但它的學習成本也相對比較高。在一個關於「哪些原因阻止你在 2025 年學習 Rust」的調查中,有人丟擲了一個有力的觀點:他最常用的 C/C++ 庫是同類中最好的,背後有數十年的開發經驗。對於 Rust,他要麼費盡心力地繼續使用它,要麼使用一些隨機、不知名、沒有血統的包。也有人認為,Rust 語法看起來很醜陋。
圖片
圖源:https://x.com/kai_fall/status/1875549570513658212

用了 18 個月,我滿滿的都是後悔

其實,在 2024 年初,Medium 一篇文章講述了作者花費了 18 月用 Rust 語言重建自己的演算法交易平臺的過程。雖然費了很多心思,但最終十分後悔。一起看看在這過程中,Austin Starks 到底經歷了什麼吧。
圖片
在文章開頭 Austin 就表示了他曾經十分看好 Rust,甚至是 Rust 的狂熱愛好者。Rust 看起來似乎是目前最快的、最安全程式語言之一。當然他發現不止自己一人這麼認為。如果在網上閱讀有關 Rust 程式語言的文章,你很可能會遇到壓倒性的正面評價。每一篇 Medium 上的指南、每一篇 Reddit 上的帖子、每一個 Stack Overflow 上的回答 —— 一切都在讚美它。

這是故事的開始,或者說是「噩夢」的開始,Austin 決定放棄 TypeScript,將自己的整個開源演算法交易系統重寫成 Rust。

其實,這次不好的體驗早有端倪。更早前,Austin 就寫過一篇關於使用 Rust 的經歷。他當時表示雖然非常喜歡 Rust 的速度和一些語言設計,但並不完全真正喜歡這門語言。不過文章一經發出,就遭到了猛烈的抨擊。甚至有一條高贊評論指責 Austin 是用 ChatGPT 寫的文章。這顯然已經是 AI 時代人們對文字創作最大的批評了。
圖片
Austin 進行了反思,或許是自己沒有給予 Rust 足夠的機會。他決定再使用一段時間 Rust。使用過後,他終於能夠自信地給出結論:

這門語言就是糟透了!!!

Rust 差在哪裡?

Austin 用了幾個詞來形容來總結自己對 Rust 的厭惡:糟糕、冗長、難以理解的語法和語義。
圖片
一個複雜的 Rust 函式示例

Austin 吐槽道,說 Rust 語義不糟糕的人都是在撒謊。如果沒有一個非常強大的大型語言模型,在寫函式的時候就會有很多事情做不成。他不想花 90 分鐘去弄清楚 run_transaction 函式中的 where 子句。最終,他完全放棄了使用輔助函式的想法,因為根本無法讓程式碼編譯透過。人們所說的 Rust 最大的優點(嚴格的編譯器來消除錯誤)反而是 Rust 最大的缺點。

Austin 舉了個例子,如果在 Go 中編寫這個完全相同的函式,程式碼大概會下圖這樣。雖然函式的核心結構保持相對不變, 但程式碼能直接按照預期執行,不需要做過多複雜的調整、技巧或反覆的嘗試。
圖片
Go 實現的函式

Rust 在錯誤處理方面似乎有些優勢。只要你避免使用不安全的 unwrap 來減少執行時錯誤(例如空指標異常),就可以確定程式碼會執行並持續執行。真的是這樣嗎?Austin:不!

他指出當資料出錯或發生意外時,開發者很難快速診斷問題,因為錯誤資訊往往不夠直觀,開發者可能很難弄明白錯誤的根本原因。他自嘲,可能自己沒有找到啟用堆疊跟蹤的正確方法,這讓除錯變得更加困難。
圖片
Austin:我的堆疊跟蹤在哪兒???

相比之下,Python 能夠提供堆疊跟蹤,精確告訴你發生了什麼,甚至到行號。Austin 表示,就算是 Go 語言,也有 errors.Wrap (...),讓你能夠檢視整個錯誤堆疊。顯然,這是 Rust 的設計缺陷。

除了 Rust 的設計缺陷,社群氛圍也是難評。Austin 表示,社群不能接受別人提出 Rust 有缺陷這個觀點。發表的看法會遭到攻擊,提出的問題也只能收穫陰陽怪氣。
圖片
Austin 在 Rust 社群中收到的「有用」回覆

你有用過 Rust 嗎?在評論區分享一下你的體驗吧。

擴充閱讀:半小時入門 Rust,這是一篇 Rust 程式碼風暴

參考連結:
https://www.prisma.io/blog/prisma-orm-manifesto
https://daniel.haxx.se/blog/2024/12/21/dropping-hyper/
https://spectrum.ieee.org/top-programming-languages-2024
https://medium.com/codex/i-spent-18-months-rebuilding-my-algorithmic-trading-in-rust-im-filled-with-regret-d300dcc147e0

相關文章