【最受歡迎的程式語言】Rust 提出版本更新計劃,預計 10 月上線!

Rust Edition

【我們為什麼挑選這篇文章】雖然 Python 是當紅的程式語言,但其實最受開發者喜愛的程式語言是 Rust,連微軟、Facebook 等企業也導入 Rust 程式碼。近日 Rust 在官方部落格更新 2021 edition 的計劃,預計 10 月發布。下文為讀者整理 9 項更新重點。(責任編輯:郭家宏)

本文經 新智元(公眾號 ID:AI_era)授權轉載,轉載請連繫出處
作者:新智元

Rust 語言是一種高效、可靠的通用高級語言,同時兼顧了開發效率和執行效率。Rust 除了能夠勝任性能敏感的任務以外,也在記憶體和線程安全方面有著極高的可靠性。

在更新了 1.52.1 後,Rust 又宣佈了 2021 版本新的計劃:在 10 月份發佈 1.56。

目前的 1.52.1 版本主要是針對增量編譯產生的錯誤提供了臨時的解決方案:

1. 禁用 Rust 編譯器中的增量編譯(如需開啟,則設置環境變數RUSTC_FORCE_INCREMENTAL = 1)。

2. 對於啟用了增量編譯的場景,改進了用於新驗證的診斷輸出,指示了如何透過清除增量狀態或禁用增量來解決錯誤。

Rust 是開發者最愛的程式語言,微軟、Facebook 都在用

你或許不知道,Rust 在 stackoverflow 的調查中,連續 5 年被選為最受開發者喜愛的程式語言。更是有不少知名巨頭將 Rust 語言加入到他們的專案中。

在用戶喜愛榜中 Rust 一騎絶塵,根本看不到第二名在哪兒。

Microsoft 正在將 Rust 整合到大型的專案中。有大約 70% 漏洞都與記憶體安全有關,於是便尋求更具安全性的 Rust 幫助其解決這一困擾許久的問題。

Facebook 則把 Rust 用在了源碼控制後端的程式碼重寫上。由於 Rust 可以在編譯時檢查出程式碼的錯誤,從而有效地減少了 bug 所帶來的經濟損失。

Dropbox 使用 Rust 對文件同步引擎的程式碼進行了重寫。高並發的文件同步引擎,在編寫、測試和調試方面都十分困難,而 Rust 在靜態類型和編譯檢查方面要比正在使用的 Python 性能更強。

甚至 Linux 內核也即將在 5.14 中加入對 Rust 的支持,畢竟 C++ 太爛了(不是我說的,是 Linus 說的)。

C++ solves _none_ of the C issues, and only makes things worse.
(C++ 沒有解決 C 的問題,只是讓它更糟。)

網友對 Rust 即將來臨的更新高度期待

「我已經等不及了。作為使用 Python 的人,我真的很想念對混合了變數的字元串的簡單直觀的處理。」

「所有 edition 都會被永久支持。這讓 Rust 2015 的程式碼和 Rust 2077 的程式碼的融合變為可能。」

「感謝所有 Rust 志願者,你們是最棒的!」

Rust 2021 更新計劃中的 9 個重點

1. Edition 是什麼?

Rust 提出了一種 Edition 更新形式,這種方式不會割裂生態系統。

一個向後不兼容的功能將會被作為新的 Rust Edition 的一部分。Edition 是選擇性加入的,因此,除非現有的 crate 明確遷移到新版本中,否則就不會看到這些變化。

一個 Edition 中的 crate 可以與其他 Edition 中編譯的 crate 無縫地互操作。不管 Edition 如何,所有 Rust 程式碼最終都會在編譯器中編譯為相同的內部 IR。

Edition 的遷移也幾乎是全自動的。在發佈新 Edition 的同時,會附帶一個自動遷移工具。除此以外,還有一本《版本遷移指南》,該指南既是版本的概述,也是在遇到問題的故障排除參考。

在對舊的版本進行遷移時,需要對程式碼進行一些小的更改。例如,當遷移到 Rust 2018 時,所有的「async」都會變為:「r#async」。

2. prelude 中新的內容

Rust 編譯器會優先處理手動導入的項,使得在 prelude 添加的內容不會破壞任何現有程式碼。

例如,一個名為「example」的 crate 或 module,其中包含「pub struct Option ;」,那麼可以透過使用「example::*;」,使得「Option」明確引用「example;」而不是標準庫中的。

但是,在 prelude 中添加特徵便可能會破壞現有程式碼。例如,在使用「MyTryInto」特徵調用「x.try_into()」時,如果還導入了「std」的「TryInto」,則會出現無法編譯的情況,因為它提供了具有相同名稱的方法。

作為解決方案,Rust 2021 將使用新的 prelude,其中增加了三個新的功能:

3. 默認使用 Cargo 功能解析器

自 1.51.0 起,Cargo 在選擇加入中有了對新的功能解析器的支持,該功能可以在「Cargo.toml」中使用「resolver = “2”」啟動。

從 Rust 2021 開始,這將是默認設置。也就是說,在「Cargo.toml」中寫入「edition = “2021”」就意味著「resolver = “2”」。

4. 數組疊代器 IntoIterator

在 Rust 1.53.0 之前,「IntoIterator」只能用於數組的引用。也就是說可以遍歷「&[1, 2, 3]」和「&mut [1, 2, 3]」,但不能直接遍歷「[1, 2, 3]」。

團隊在 1.53.0 之後所有版本中添加特徵實現。在 Rust 2015 和 2018 程式碼中,編譯器仍會將「 array.into_iter()」解析為「(&array).into_iter()」。

這僅適用於「.into_iter()」調用語法, 而不會影響任何其他語法,例如「for e in [1, 2, 3]」,「iter.zip([1, 2, 3])」或「IntoIterator::into_iter([1, 2, 3])」。

5. 閉包(closures)的捕獲

閉包會自動從程式碼塊中捕獲所有的引用。例如,「|| a. + 1」會自動從周圍的上下文中捕獲對「a」的引用,不僅僅是「a.x」。這會在某些情形下造成問題。