發(fā)布時間:2023-11-27 02:31:11 瀏覽量:119次
作者 | Nabil Elqatib
譯者 | 平川
策劃 | 劉燕
本文最初發(fā)布于 Nabil Elqatib 的個人博客。
接觸 Rust 開發(fā)快兩年了。我覺得,回顧下自己在這個過程中的一些感想和汲取的經(jīng)驗教訓,應該會很有趣。
下圖是我第一次向一個 Rust 存儲庫提交代碼。雖然時間是 2021 年 1 月,但彼時我接觸 Rust 已經(jīng)有幾個周了。
在 2020 年 12 月找到一份新工作之前,我早就聽說過 Rust。以我嵌入式開發(fā)的視角看,我認為 Rust 是一種現(xiàn)代而強大的語言,最終可能成為 C/C++的合法繼承者。我隱隱有一種擔優(yōu),我可能會錯過一個新時代的開始。
劇透:事實證明,Rust 并沒有取代 C/C++,不過它正在穩(wěn)步增長。它越來越受開發(fā)人員歡迎,甚至谷歌也對它懷有濃厚的興趣。
首先需要聲明一下:我沒有正式學習過 Rust。相反,我只是通過開發(fā)、閱讀代碼和來回翻閱文檔來學習?;叵肫饋?,我認為這并不是一個好的做法。我堅信,在實際使用這門語言進行開發(fā)之前,必須花一些時間,利用官方提供的學習資料來快速地理解這門語言、它的哲學和生態(tài)系統(tǒng)。
我記得,Rust 是作為一種強類型語言向人“推銷”的,它承諾提供強大的工具,通過在編譯期間跟蹤對象生命周期和所有引用變量的作用域,來防止內(nèi)存安全 Bug(見下一小節(jié))。Borrow-checker 出場!
在使用靜態(tài)類型和Rc以及其他微妙的語言構(gòu)件處理多個 crate 時,這個看起來非常簡單的想法(Rust 文檔中關于這部分的內(nèi)容非常全面)變成了一場噩夢。當時,我很難理解這個新概念,最容易鉆的空子是不斷地克隆變量,這樣做不好(特別是在處理大型數(shù)據(jù)結(jié)構(gòu)時),而且還有一個副作用,就是使我花了更多的時間才最終掌握它。
幸運的是,編譯器提供了非常有用的提示和文檔鏈接,我必須說,它們非常有用。
這是一個非常普遍的誤解,是我最近與一位非 Rust 工程師同事聊天時了解到的。在他看來,Rust 程序因為運行時內(nèi)存越界故障而恐慌(panic)是不可想象的。遺憾的是,Cargo 編譯器并不是一種包治百病的靈丹妙藥,顯然,欺騙它成功編譯只會在運行時失敗的程序很容易。下面這個例子使用了一種非常常見的 Rust 數(shù)據(jù)結(jié)構(gòu):
let mut v = vec![];
v.push(0);
v.clear();
let _ = v[0]; // panics
或者更棘手:
let mut v = Vec::new();
#[cfg(target_os = "windows")]
v.push("a");
let _ = v[0]; // panics
在編譯時檢測越界訪問需要對代碼進行更深入的分析,這可以顯著降低編譯速度(在我看來,編譯時間已經(jīng)太長了)。
這一節(jié)和我最近觀察到的一個行為有關。我們的團隊發(fā)現(xiàn),在特定條件下,生產(chǎn)環(huán)境中的其中一個 crate(依賴項的)依賴項開始出現(xiàn)恐慌。簡單來說就是,當與rustls-tls-native-roots特性一起使用時,如果系統(tǒng)證書損壞,那么特定版本的reqwest會引發(fā)錯誤和恐慌。
這讓我很驚訝,因為它使得處理依賴關系多了幾分風險。
盡管現(xiàn)在大多數(shù) crate 都是開源的,但人們也不能為了評估使用“風險”而把所有源代碼都檢查一遍。而且,大多數(shù) crate 的文檔比較糟糕,也沒法提供很好的支持。有一個類似于 cargo tree 的工具,可以分析項目的依賴關系,讓開發(fā)人員可以概覽容易出現(xiàn)恐慌的 crate,會非常有幫助。
習慣上,快速處理這個問題的一個替代方法是重寫 Rust 的panic_handler,但很遺憾,這只有在#![no_std] 項目中才有可能。
說到來自嵌入式世界的no_std,這是我特別感興趣的一個點。我還沒有機會為內(nèi)存有限的低端設備和外設編寫 Rust 代碼。盡管這現(xiàn)在不是我關心的問題,但 Rust 二進制文件的開銷確實非常大。
我讀過一些關于這個話題的博客和論文,特別是 Jon Gjengset 的視頻,非常有趣,因為他們概要介紹了一個真實的實踐過程。但我想說的是,對于內(nèi)存有限的目標設備,Rust 要成為 C 語言的有力競爭者還有很長的路要走。我覺得,在#![no_std] 領域,Rust 還需要找到一種方法來提供可行的恐慌處理程序庫,不再依賴開箱即用的格式化函數(shù),因為它們非常消耗內(nèi)存。James Munns的這篇文章讓我大開眼界。
這點也給我留下了深刻的印象。
我參與過一個項目,包含 900K+行與 Rust 互操作的 C 代碼。這并沒有多難,因為 Rust 讓這個過程變得非常簡單,而且,因為有許多 crate 和示例,這個用例似乎也已經(jīng)比較完善。借助 FFI 機制,為外部代碼編寫 Rust 綁定也相對簡單,我不能說所有語言,但 C 語言家族(C/ C++ /Objective-C)都得到了很好的支持。
這不是說沒有多少工作要做了,因為你還需要編寫一些“管道”代碼來把所有東西串聯(lián)起來,這有代價,但我認為相當?shù)汀4送?,Rust 堅持自己的哲學,要求將可疑的底層代碼聲明為不安全的,這一點很好(實際上,基本上所有 FFI 函數(shù)都是不安全的,因為 Rust 無法控制用另一種語言編寫的代碼)。
最后說一個積極的方面。Rust 是一種非常豐富的語言,有可能讓系統(tǒng)編程取得巨大的進步。嚴格的所有權和借閱有助于確保數(shù)據(jù)訪問安全高效。它的現(xiàn)代語法和設計使得開發(fā)人員更容易理解和使用這門編程語言的軟件模式和最新范式。此外,雖然說的不多,但 Rust 在線程并發(fā)運行方面做得非常好,可以保證不出現(xiàn)競態(tài)條件及類似問題。
我真的很喜歡 Rust 開發(fā)。如果在 2020 年甚至 2022 年要選擇一種新的軟件開發(fā)語言,那么我一定會毫不猶豫地選擇 Rust。我看到了它的巨大潛力,希望接下來的幾個月里,它可以獲得嵌入式系統(tǒng)世界的更多關注。最近發(fā)布的 Rust Linux 內(nèi)核模塊顯示出了其廣闊的前景和光明的未來。
就我個人而言,我希望更多地參與塑造 Rust 的未來,為它的軟件做出貢獻,同時不斷學習它的概念及那些紛繁蕪雜之處。
聲明:本文為 InfoQ 翻譯,未經(jīng)許可禁止轉(zhuǎn)載。
原文鏈接:
https://n-eq.github.io/blog/2022/11/01/rust-fiddling-2-years
熱門資訊
探討游戲引擎的文章,介紹了10款游戲引擎及其代表作品,涵蓋了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戲設計領域和數(shù)字藝術教育的重要性,歡迎點擊咨詢報名。
2. 手機游戲如何開發(fā)(如何制作傳奇手游,都需要準備些什么?)
?如何制作傳奇手游,都需要準備些什么?提到傳奇手游相信大家都不陌生,他是許多80、90后的回憶;從起初的端游到現(xiàn)在的手游,說明時代在進步游戲在更新,更趨于方便化移動化。而如果我們想要制作一款傳奇手游的
3. B站視頻剪輯軟件「必剪」:免費、炫酷特效,小白必備工具
B站視頻剪輯軟件「必剪」,完全免費、一鍵制作炫酷特效,適合新手小白??靵碓囋嚕?/span>
游戲中玩家將面臨武俠人生的掙扎抉擇,戰(zhàn)或降?殺或放?每個抉定都將觸發(fā)更多愛恨糾葛的精彩奇遇。《天命奇御》具有多線劇情多結(jié)局,不限主線發(fā)展,高自由...
5. Bigtime加密游戲經(jīng)濟體系揭秘,不同玩家角色的經(jīng)濟活動
Bigtime加密游戲經(jīng)濟模型分析,探討游戲經(jīng)濟特點,幫助玩家更全面了解這款GameFi產(chǎn)品。
6. 3D動漫建模全過程,不是一般人能學的會的,會的多不是人?
步驟01:面部,頸部,身體在一起這次我不準備設計圖片,我從雕刻進入。這一次,它將是一種純粹關注建模而非整體繪畫的形式。像往常一樣,我從Sphere創(chuàng)建它...
7. 3D動畫軟件你知道幾個?3ds Max、Blender、Maya、Houdini大比拼
當提到3D動畫軟件或動畫工具時,指的是數(shù)字內(nèi)容創(chuàng)建工具。它是用于造型、建模以及繪制3D美術動畫的軟件程序。但是,在3D動畫軟件中還包含了其他類型的...
?三昧動漫對于著名ARPG游戲《巫師》系列,最近CD Projekt 的高層回應并不會推出《巫師4》。因為《巫師》系列在策劃的時候一直定位在“三部曲”的故事框架,所以在游戲的出品上不可能出現(xiàn)《巫師4》
想讓你的3D打印模型更堅固?不妨嘗試一下Cura參數(shù)設置和設計技巧,讓你輕松掌握!
10. 虛幻引擎5節(jié)省存儲空間用這招!緩存的清理與設置
眾所周知,虛幻引擎5(下面簡稱UE5)特別占用存儲空間,僅一個版本安裝好的文件就有60G,這還不包括我們在使用時保存的工程文件和隨之產(chǎn)生的緩存文件。而...
最新文章
同學您好!