首頁  >  文章  >  後端開發  >  地鼠 Rust

地鼠 Rust

王林
王林原創
2024-07-19 14:08:58763瀏覽

Rust for Gophers

閱讀 packagemain.tech 上的原文

你應該 Rust,還是應該 Go?哪種語言比較好,這個問題有意義嗎?讓我們與我們的特邀嘉賓 John Arundel 一起討論 2024 年的 Go 與 Rust。 John 是《For the Love of Go》、《Cloud Native DevOps with Kubernetes》和許多其他書籍的作者。他也教授 Go 和 Rust,所以聽聽他的觀點會很有趣。採訪來了!

約翰,這些天我們似乎越來越多地聽到有關 Rust 的消息。能給我們簡單介紹一下嗎? Rust 的用途是什麼?它為何存在?

當然,這很簡單。 Rust 是一種控制電梯的語言。

你在開玩笑吧?

一點也不。 Rust 的創辦人 Graydon Hoare 當他所在大樓的電梯因軟體問題而不斷出現故障時感到沮喪。他想:「我們當然可以做得更好!」其餘的都是歷史了。

我們無法阻止所有錯誤,但我們至少可以使用一種程式語言來消除一些主要類別的錯誤,例如緩衝區溢位、資料競爭和「釋放後使用」問題。因此,從一開始,Rust 的重點就是建立可靠的軟體,自動執行優秀程式設計師無論如何都會做的許多安全檢查,並幫助在投入生產之前發現錯誤。

這聽起來是個好主意,但我的印像是 Rust 是一門很難學的語言——尤其是與 Go 相比。這樣公平嗎?如果公平,為什麼?

Go 和 Rust 都在以不同的方式嘗試解決同一個問題:用 C 和 C++ 等傳統語言很難大規模編寫軟體,因為程式設計師必須非常有經驗和知識淵博才能避免犯錯。即使是專家也會時不時地犯錯,而培養程式設計師成為專家需要很長時間。

Go 透過從根本上簡化語言來解決這個問題:與 C++ 等語言相比,它需要學習的語法要少得多。因此程式設計師可以把時間花在學習如何寫好程式上,而不是掌握一門大而複雜的語言。 Go 很精簡,但很有效。

打個比方,學習駕駛拖拉機比學習駕駛太空船更容易。拖拉機可能是一種不起眼、實用的機器,但它能完美地完成自己的工作,而且對於許多任務來說,它實際上是比太空船更好的選擇:例如犁地。

我喜歡你的比喻。我猜 Rust 就是太空船?

是的,Rust 龐大、複雜且強大,它將 C 等傳統命令式語言的許多最佳思想與借鑒 Haskell 和 Lisp 等語言的函數式程式設計概念相結合。

Rust 比 Go 需要學習的東西更多,但它的作用也更多!如果你想飛往火星,太空船是比拖拉機更好的選擇。當然,訓練一名太空人比訓練一名拖拉機司機需要更長的時間。

Go 有內建的垃圾收集,這非常簡單。 Rust 中的記憶體管理是如何運作的,學習起來是不是一個很大的挑戰?

是的,垃圾回收意味著您不必像在 C++ 等語言中那樣擔心自己分配和釋放記憶體。這使得編程變得更加容易,並消除了各種與記憶體相關的錯誤。另一方面,你需要相對複雜的運作時,垃圾收集會影響效能。

Rust 採用了不同的方法。它會自動回收內存,但無需暫停程式。它可以透過追蹤對存在的特定資料塊的所有引用來做到這一點。當程式的任何部分都無法再引用資料時,Rust 知道可以立即安全地回收該記憶體位。

是的,我聽說 Rust 非常關注所有權和借用。這些概念與在 Go 中使用指標相比如何?有哪些好的方法可以幫助我理解它們?

嗯,我有個好消息——如果你已經習慣了 Go 中的指針,那麼 Rust 中的引用的工作方式基本上相同,只是更安全。如果您建立對變數的可變引用,它的工作方式就像 Go 指標一樣:您可以將其傳遞給函數,或將其儲存在某個地方。

但是,與 Go 不同的是,只要該可變引用存在,它就具有對資料的獨佔存取權:其他人無法修改它,甚至無法讀取它。用 Go 術語來說,這就像擁有一個自動互斥鎖。當函數不需要修改資料時,它可以藉用共享引用,該引用是唯讀的,並且可以同時存在許多引用。

Rust 也會追蹤原始資料:當它超出範圍時,對它的任何引用都不再有效。因此,編譯器可以偵測到多種懸空指標錯誤,在這些錯誤中,您嘗試使用對不再存在的值的參考。這會導致未定義的行為,這是一種很好的方式來表達可怕的事情將會發生,而 Rust 的價值主張的一部分是「永遠沒有未定義的行為」。

在 Rust 中,我們必須找到一種編寫程式的方法,以便對資料的引用始終有效,並且一次只存在一個可變引用。這需要一些時間來適應(Rust 程式設計師稱之為「對抗借用檢查器」),但產生的程式更可靠,而且更有可能是正確的。

例如,所有Go 程式設計師都熟悉數據競爭,即兩個或多個goroutine 嘗試同時存取某些共享數據,結果不可預測:最好的情況是程式崩潰,最壞的情況是繼續運行數據已損壞或無效。

在 Rust 中,這樣的程式無法編譯!所有權和引用規則意味著對同一事物的兩個可變引用不能同時存在。你只需要用不同的方式解決問題。

這給我們帶來了並發性。我喜歡 Go 的通道和協程的並發特性。 Rust 如何處理並發,我的 Go 經驗是否有任何相似之處?

是的,goroutine 和通道很棒:超輕量級的任務抽象,與傳統的多執行緒相比非常便宜。另一方面,Go 只為我們提供了基本的構建塊:我們有責任確保安全地使用它們,避免資料爭用或死鎖。而這可能很難做到!

Rust 沒有 goroutine,但它有非同步任務,這很像 goroutine,只是具有通常的 Rust 安全保證。還有一些優秀的第三方框架,例如 Tokio 和 Rayon,它們可以取得一堆資料並自動找出最有效的平行處理方法。

所以,雖然並發程式總是很難寫好,但如果你能在 Go 中做到這一點,你會發現這些技能也可以很好地轉移到 Rust。

我喜歡邊做邊學。對於開始使用 Rust 的 Go 程式設計師,您有什麼好的實作練習或專案推薦嗎,例如 Go 之旅?

Rustlings 是一個很好的起點:它是一組互動式小練習,可引導您完成所有語言基礎知識。如果您想從真實的人類那裡獲得反饋,請查看 Exercism 上的 Rust 曲目。還有 Rust by Example,這是用於工作範例片段的絕佳資源。

聽起來您是兩種語言的粉絲。您比較喜歡哪一個?您是否會建議已經了解 Go 的人也嘗試學習 Rust?

是的,Go 和 Rust 分別吸引了我大腦的不同部位。我喜歡 Go 的極端簡單性和實用主義:它用很少的資源做很多事情,並且很好地解決了大多數問題。

另一方面,Rust 巧妙地填補了 Go 不是理想選擇的空白:核心、韌體、嵌入式設備以及醫療設備、工業、航空航太等安全關鍵應用。

當然還有電梯。

當然!所以我喜歡 Rust 的這一方面,它也是一種非常有趣且富有表現力的語言。我認為任何人都值得花時間來玩 Rust,並堅持足夠長的時間來克服最初對語法的不熟悉,以及與借用檢查器的鬥爭。

即使您認為 Rust 不適合您,您也會學到一些有趣的思考問題的新方法,並且它還可以幫助您更多地了解 Go 所做的不同權衡。

從職業角度來看,Go 和 Rust 在可預見的未來都將是非常有價值的技能。我認為很快,我們將討論“Go 和 Rust 與其他一切”,而不是“Go 與 Rust”。

John,感謝您成為我們的客人,並向我們提供您對 Go 和 Rust 的看法。人們可以在哪裡找到有關您的更多信息,例如,他們是否對您的書籍或培訓課程感興趣?

這是我的榮幸!如果您想了解更多信息,請訪問我的網站 bitfieldconsulting.com,或聯繫我 — 我很樂意與您聊天。

以上是地鼠 Rust的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn