天天看點

基于 Rust 的未來已來!

作者:進階前端進階

大家好,很高興又見面了,我是"進階前端‬進階‬",由我帶着大家一起關注前端前沿、深入前端底層技術,大家一起進步,也歡迎大家關注、點贊、收藏、轉發!

基于 Rust 的未來已來!

進階前端‬進階

1.Rust 的現狀

在 Stack overflow 2020 調查中,Rust 被選為最受歡迎的程式設計語言第一名,這要歸功于 86% 的開發人員表示他們會繼續使用它。 對于語言創造者來說,這并不是什麼新鮮事——自 2016 年以來,Rust 一直在調查中獲勝。在 Tiobe 指數上,Rust 的受歡迎程度也在上升——9 月份在最受歡迎的語言中排名第 18 位。 它在自己的基于情緒分析的函數式程式設計語言排名中也沒有失敗,在最積極的情緒類别中獲得第一名。

基于 Rust 的未來已來!

Rust 由前 Mozilla 開發人員 Graydon Hoare 于 2006 年建立,作為 C++ 語言的替代品,Rust 正在開發人員的世界中慢慢地為自己正名。 它現在用于建立網絡軟體、嵌入式計算機和分布式服務或指令行。 這種受歡迎程度的适當證明使全球巨頭微軟正在慢慢地從 C++ 語言(由于越來越多的安全問題)轉向 Rust。

當程式員有這麼多其他語言可以使用時,是什麼讓 Rust 在程式員中如此受歡迎? 主要原因之一是 Rust 解決了許多在不同語言中可見的問題——以至于一些開發人員說 Rust 的建立者必須考慮到 C++ 中可見的所有潛在問題。 究竟是什麼讓 Rust 如此獨特,值得學習 Rust? 以下是我們認為 Rust 是未來的五個原因。

2.Rust 與其他語言對比

Rust 相對于目前為開發人員所熟知的許多語言都有其優勢,讓我們一起對比下這些語言。

2.1 Rust 與 C++優勢

與 C++ 相比,Rust 會更安全。 Rust 保護它自己的抽象和開發人員所做的抽象,而 C++ 缺乏這兩種選擇。 C++ 中的特定錯誤可能導緻任意行為,而 Rust 可幫助您專注于真正重要的事情。

C/C++ 仍然被認為是最流行的程式設計語言之一,但它經常會導緻一些問題。 Rust 更容易上手,學習曲線不是很陡峭,Rust 沒有像 C++ 中那樣的技術負擔,具有更容易的并發性,并且性能具有可比性。Rust 允許程式員編寫不安全代碼,但預設為安全代碼(如果您選擇加入,您可以使用 unsafe 關鍵字在 Rust 中編寫不安全代碼——它預設帶有 C++)。

2.2 Rust vs Java

2.3.1 安全

近年來,針對 Java 的安全問題持續升溫,安全是平台産品的基礎。而 Rust 的語言特質使得其對安全有着與生俱來的優勢。當然 Java 也有其解決方案,比如對于漏洞最多的反射問題,可通過 GraalVM 可以生成 Native 代碼規避,但該方案尚不成熟

2.3.2 性能

Java 生态可以寫出非常高性能的代碼,但前提是必須用 NIO 模型。由于 Java 缺乏 Continuations/Fibers 支援,幾乎不能實作現代語言都支援的 async/await 的同步化異步程式設計。是以不可避免會導緻代碼的組織及可讀性降級。Project Loom 項目有希望解決這一問題,但沒有具體時間。相較而言,Rust 有着媲美 C++的性能,對異步程式設計的支援也十分友好

2.3.3 成本

Java 程式對系統資源的占用比較高,即便是使用 JDK9 的 Module 也隻能降低一些記憶體資源的消耗。典型的一個微服務執行個體(基于 Spring Boot)一般至少需要 200MB 的體積及 500MB 的記憶體。這對 SaaS 化部署而言還能接受,但如果要本地化部署,一個本産品假定包含 20 多個原子化的微服務,不包含依賴的三方中間件,生産部署至少需要 20G 的記憶體,這會勸退大量潛在的客戶。而 Rust 作為系統級的語言,有着很小的運作時開銷,在同等性能下資源的占用會是 Java 的 1/4 左右,并且由于 Rust 的 Cargo 包很好的解決了“dependency hell"問題,是以不同的原子化微服務可以聚合成一個服務,這對 PoC 非常友好

2.3.4 産權保護

Java 的反編譯手段很多,目前并沒有非常出色的加密/混淆工具,而 Rust 直接編譯成可執行代碼。通過将核心代碼用 Rust 封裝可以很好的保護代碼安全。

2.3.5 統一

低代碼建構時 Webassembly 技術會有比較大的用武之地,而 Rust 是該技術最成熟的開發語言。在前後端統一架構設計上 Rust 也有比較明顯的優勢

當談到 Java 時,事實證明這種程式設計語言比 Rust 慢得多,特别是考慮到在許多場景都與 C 保持同步。 此外,Rust 具有更快的啟動時間和更小的記憶體占用。 Java 使用垃圾回收機制進行記憶體管理,這會降低性能(盡管值得注意的是它使程式設計更容易)。

2.3 Rust vs Python

2.3.1 性能

Rust 超越 Python 的一個主要原因是性能。因為 Rust 是直接編譯成機器代碼的,是以在你的代碼和計算機之間沒有虛拟機或解釋器。

與 Python 相比,另一個關鍵優勢是Rust 的線程和記憶體管理。雖然 Rust 不像 Python 那樣有垃圾回收功能,但 Rust 中的編譯器會強制檢查無效的記憶體引用洩漏和其他危險或不規則行為。

2.3.2 記憶體管理

Python 和大多數現代程式設計語言一樣,被設計成記憶體安全的。然而 Rust 在記憶體安全方面卻讓 Python 望塵莫及,即使沒有垃圾回收。

Rust 采用了一種獨特的方式來確定記憶體安全,其中涉及所有權系統和借用檢查器(borrow checker)。Rust 的借用檢查器確定引用和指針不會超過它們所指向的資料。

2.3.3 錯誤檢查與診斷

與大多數編譯語言相比,Rust 因其速度快、記憶體安全有保證、超強的可靠性、一緻性和使用者友好性而備受青睐。在程式設計中,我們已經到了速度開始變得毫不費力的地步。

随着技術的發展,它變得越來越快,試圖在更短的時間内做更多的事情,而不需要那麼多的權衡。Rust 幫助實作了這一點,同時又不妨礙開發者的工作。當技術試圖推動可以實作的邊界時,它也會考慮系統的安全性和可靠性,這是 Rust 背後的主要思想。

2.3.4 并行運算

除了速度外,Python 在并行計算方面也有局限性。Python 使用全局解釋器鎖(GIL),它鼓勵隻有一個線程同時執行,以提高單線程的性能。這個過程是一個阻礙,因為它意味着你不能使用多個 CPU 核進行密集計算。

2.4 Rust vs Go

Golang 和 rust 的主要差別在于:

  • 性能
  • 并發
  • 記憶體安全
  • 發展速度
  • 開發者經驗

2.4.1 Rust 編譯慢但執行快?

谷歌推出了 Go,作為 C++的替代品,它的代碼和學習都很簡單。Go 提供并允許你利用 Goroutines,通過它,人們可以通過簡單地包含 Go 文法來運作函數。

盡管有這些實用的功能和多核 CPU 的支援,Rust 還是占了上風,并且超過了 Go。

是以,Go vs Rust:性能是 Rust 與 Golang 相比得到更多分數的一個特點。這些程式設計語言都是為了與 C++和 C 語言等效而建立的。然而,在 Rust 與 Go 的比較中,Golang 的開發速度比 Rust 的性能高一些。

雖然 Rust 的輸出顯示對 Go 有優勢,但 Rust 在編譯速度上卻落後于 Go,因為 Go 在這方面擊敗了 Rust。

然而,人們并不太在意編譯時間,是以總體來說 Rust 是這裡的赢家。

2.4.2 并發設計方式 Rust 更簡潔?

Golang 支援并發,在這個因素上比 Rust 更有優勢。Go 的并發模型允許開發者在不同的 CPU 核心上安裝工作負載,進而使 Go 成為一種連貫的語言。

是以,在你運作一個處理 API 請求網站的情況下,Golang goroutines 會要求你把每個請求作為一個子程序來運作。這個過程提高了效率,因為它減少了所有 CPU 核心的任務。

而 Rust 隻有一個本地的 await 或 sync 文法。是以,程式員們更喜歡用 Go 的方式來處理并發問題。

2.4.3 兩者記憶體安全,但 Rust 性能勝出

Rust 使用了一個編譯時的政策,用零成本的中斷來實作記憶體安全。如果不是記憶體安全的程式,Rust 将沒有能力清除編譯階段。事實上,Rust 的好處在于它提供了記憶體安全。

Rust 編譯器會調查你引用的每一個記憶體位址和你使用的每個變量,它可以確定程式員不會出現緩沖區溢出。

相比之下,Go 在運作時完全自動化。是以,在編寫代碼時,開發人員将不必擔心删除記憶體。是以,Golang 和 Rust 都優先考慮了記憶體安全特性,但在性能的基礎上,Golang 存在着資料競争的可能性。

2.4.4 Rust 的學習曲線比 Go 要陡峭得多?

由于開發 Go 的主要動機是簡單和易于使用,是以大多數程式員認為它是一種 "無聊的語言 "或 "簡單的語言"。Go 中有限的功能使它非常容易學習和執行。

相反,Rust 帶有很高的記憶體安全特性,使代碼更加複雜,程式員的工作效率降低。所有權的概念使得 Rust 語言對許多人來說是一個不理想的選擇。Rust 的學習曲線比 Go 要陡峭得多。

3.為什麼 Rust 是未來?

3.1 Rust 提高了記憶體安全性。

困擾開發人員的最大問題之一是記憶體管理問題, 而且一個更大的問題是編碼錯誤可能會導緻安全漏洞。在當今世界,這太危險了。 在大型和流行的網站或應用程式中,資料安全漏洞案例發生的頻率遠比我們希望的要高, 而這通常是應用程式漏洞或配置錯誤。

Rust 被認為是記憶體安全的。 Rust 代碼不能有任何空指針、緩沖區溢出或任何其他類型的記憶體相關錯誤。 它允許您定義記憶體的管理方式以及記憶體中的值的布局方式,在不損失性能的情況下兼顧控制和安全,這些都是 Rust 的重大特性。

提高記憶體安全性是 Rust 開發人員的主要目标之一,也是該語言最重要的賣點。 他們的代碼編譯器非常嚴格,每一個使用到的變量或者記憶體位址都會被自動檢查。 如果發現任何文法錯誤、空值、空修飾符或記憶體安全問題,Rust 将不會編譯代碼并警告不安全代碼,以便快速發現和修複問題。 那麼它是如何做到的?

在 Rust 中,每個值都有一個“所有權”。 當一個值被傳遞或傳回時,所有權被賦予一個新的範圍——并且一次隻有一個。 如果值的“所有者”移出範圍,則該值将被删除。 這樣,Rust 會跟蹤記憶體并自動釋放它,進而防止所有錯誤進入主代碼。 這意味着在運作時不會有任何意外! 該系統将在編譯時分析記憶體管理,幫助更快地識别和修複錯誤,并使垃圾收集變得不必要。

但記憶體遠不止于此。 建構進階系統通常與計算量大的工作和建立大量臨時記憶體有關。 這種解除安裝會對任何 Java 虛拟機性能産生負面影響,許多程式設計語言(包括 Scala)根本無法處理它。

然而,Rust 可以。 它支援編寫節省記憶體的代碼,無需管理記憶體或使用諸如閉包之類的方法,以最小或無運作時開銷運作,用于實時或嵌入式項目,并可輕松與其他語言或項目內建。

3.2 Rust 的社群不斷壯大。

Rust 的社群和庫的數量遠不及 C++, 但随着 Rust 語言的日益普及,加入 Rust 語言的開發人員和熱情人士的數量也在增加。 社群建立的架構、庫和開發工具的數量已經接近 57k,并且每天都在增加。

除了不斷增長的工具和架構庫之外,Rust 還擁有一個活躍而熱情的社群。 無論您是需要幫助解決問題還是尋找使用 Rust 的提示和技巧,您都可以通路幾個地方。 除了社群聊天和使用者論壇,Rust 還有一個活躍的 subreddit 部分。

看看一些新興社群項目的例子:

  • redox,一個用 Rust 編寫的作業系統;
  • cgmath,一個線性代數和計算機圖形庫;
  • Iron,一個并發網絡架構;

3.3 Rust 快速且靈活。

Rust 被認為是一種執行效率很高的語言, 當使用通用代碼時,它可以比 Scala 運作得快得多,尤其是在性能關鍵型任務中。 在某些領域,它的運作速度很可能比 Scala 或 Java 快三倍。 同時,引入和使用外部包很容易,Rust 的 cargo 建構工具使編碼變得更加簡單。

下面幾個因素使 Rust 執行非常快:

  • 它是靜态類型和編譯的,使編譯器可以優化代碼以提高速度
  • 它提供特征的靜态分派:類似于 C++ 模闆,但更簡潔
  • 它明确地跟蹤變量的所有權。 Rust 不假設任何具有位址的變量都可以随時更改,是以可以在不對代碼産生負面影響的情況下進行優化。
  • 它期望變量在預設情況下是不可變的(是以優化更容易)
  • 它提供代數資料類型,也有利于優化
  • 它存儲資料沒有任何開銷,沒有運作時或由于缺乏垃圾收集而突然暫停
  • 它提供零成本抽象

Rust 也可以被認為是一種類似于 Rust 的程式設計語言,但更易于優化,并且具有更簡單的進階程式設計功能。

3.4 Rust 可以廣泛使用

如果有一個項目,除了要考慮性能和底層優化的重要性(還有進階 Rust 函數式程式設計技術)之外,還需要一個安全穩定的執行環境,推薦使用 Rust。Rust 被認為是一種底層語言,适合系統級研發,以及嵌入式和其他性能關鍵代碼。 據信它也可用于 3D 視訊遊戲。

那麼,為什麼 Rust 如此受到全世界開發者的喜愛? 首先,它讓您編寫的代碼很可能永遠不會出錯,因為編譯器會檢查所有代碼。 在編譯時在其他程式設計語言中檢測到的問題不會出現在 Rust 中。 它也有利于編寫安全省時的抽象,它的安全性幾乎消除了使用不變性的需要。

Rust 也被認為是一種用于新興的、創新的語言,這些場景關心性能、速度和安全性的組合品質。

Rust 是一種流行的加密貨币和區塊鍊程式設計語言, 這是一個很好的選擇,因為它易于了解和學習,并且提供了性能和安全性的獨特組合,而後者正是開發人員正在苦苦尋找的東西。 Rust 還為這些開發人員提供工具,以更快地開始傳遞他們的代碼。 選擇 Rust,加密貨币很可能不會崩潰,而且比使用其他程式設計語言更安全。 在參考資料中,您可以找到使用 Rust 的加密貨币清單。

3.5 那些大公司使用 Rust?

盡管 Rust 是一門相對年輕的語言,但在提高程式設計的安全性和易用性方面,Rust 已經被開發人員公認為是朝着正确方向邁出的一步。 不僅開發人員對 Rust 感興趣,公司、尤其是主要公司,也已經或計劃轉向 Rust。 在 5 月份舉行的 AllThingsOpen 虛拟會議上,Ryan Levick(微軟雲開發人員倡導者)解釋說,Rust 作為一種語言是“業界正面解決多個問題的最佳機會”。 雖然微軟不打算很快停止使用 C++ 編寫代碼,但它的許多基礎設施正在慢慢轉向 Rust。

微軟并不是唯一一家意識到切換到 Rust 語言潛在好處的公司——使用 Rust 語言的公司包括 Dropbox、Sentry、Amazon 和 Mozilla。

4.結論

看看 Rust 可以提供的所有好處,該語言的受歡迎程度隻會越來越高也就不足為奇了。 Rust 解決了一些在開發人員社群中引起許多令人頭疼的問題,同時保持了與其他更知名的程式設計語言相同的性能水準。 由于開發人員和 IT 領域的主要參與者都認識到 Rust 語言的潛力,可以毫不誇張地說 Rust 有一天将成為現代世界中最常用的程式設計語言之一。

參考資料

https://medium.com/scalac/5-reasons-why-rust-is-the-future-7ac731085339

https://www.reddit.com/r/rust/comments/a93dv8/cryptocurrencies_written_in_rust/

https://www.yisu.com/zixun/601244.html

https://zhuanlan.zhihu.com/p/539487030

https://medium.com/@knoldus/why-rust-for-embedded-development-9f2b827596f9

https://medium.com/@knoldus/why-rust-for-embedded-development-9f2b827596f9

https://medium.com/knoldus/why-rust-what-is-rust-837b32976a01