激情六月丁香婷婷|亚洲色图AV二区|丝袜AV日韩AV|久草视频在线分类|伊人九九精品视频|国产精品一级电影|久草视频在线99|在线看的av网址|伊人99精品无码|午夜无码视频在线

rust 游戲開發(fā)(程序員上手 Rust 2 年后感悟:它的確強大,但想要取代 C 還遠著呢)

發(fā)布時間:2023-11-27 02:31:11 瀏覽量:119次

?程序員上手 Rust 2 年后感悟:它的確強大,但想要取代 C 還遠著呢

rust 游戲開發(fā)(程序員上手 Rust 2 年后感悟:它的確強大,但想要取代 C 還遠著呢)

作者 | 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ā)錯誤和恐慌。


rust 游戲開發(fā)(程序員上手 Rust 2 年后感悟:它的確強大,但想要取代 C 還遠著呢)

這讓我很驚訝,因為它使得處理依賴關系多了幾分風險。


盡管現(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

rust 游戲開發(fā)(程序員上手 Rust 2 年后感悟:它的確強大,但想要取代 C 還遠著呢)

熱門課程推薦

熱門資訊

請綁定手機號

x

同學您好!

您已成功報名0元試學活動,老師會在第一時間與您取得聯(lián)系,請保持電話暢通!
確定