【最受歡迎的程式語言】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」。這會在某些情形下造成問題。

當結構的某個欄位被借用或移出時,其他欄位將無法再用於閉包中,因為整個結構都會因為被捕獲而變得不再可用。

從 Rust 2021 開始,閉包將僅捕獲其使用的欄位。

由於這個變化會對欄位的刪除順序造成影響,目前僅在新版本中被啟動。如果像以前一樣捕獲整個結構,則可通過在閉包中插入「let _ = &a;」得到。對於其他版本,可以使用自動遷移,從而更新相關的閉包。

6. Panic 宏的一致性

「panic!()」宏僅在使用多個參數調用時才使用字元串格式。當使用單個參數調用時,它甚至不會查看該參數。

一旦隱式格式參數被確定,就會出現問題了。此時「println!(“hello {name}”)」會變成「println!(“hello {}”, name)」的簡寫形式。但是「panic!(“hello {name}”)」無法執行,因為「panic!()」不會將單個參數作為格式化字元串處理。

為了避免這種情況,Rust 2021 提供了更具一致性的「panic!()」宏。新的「panic!()」宏將不再接受任意表達式作為唯一參數。而是像「println!()」一樣,始終將第一個參數作為格式化字元串處理。

由此「panic_any()」便成為了對格式化字元串以外的其他內容進行「panic」的唯一方法。

另外,Rust 2021 中的「core::panic!()」和「std::panic!()」將會是等效的。目前,這兩者之間存在一些差異,尤其是在開啟或關閉「#![no_std]」時 。

7. 保留的語法

為了將來為某些新語法騰出空間,我們決定為首碼的標識符和文字保留語法:「prefix#identifier」,「prefix”string”」,「prefix’c’」和「prefix#123」,其中「prefix」可以是任何標識符(除了那些已經具有含義的,例如「b’…’」和「r”…”」)。

這是一個重大變化,因為宏會接受「hello”world”」,並視其為兩個單獨的標記:「hello」和「”world”」。解決方法很簡單,只需插入一個空格:「hello “world”」

這些是可能會看到的一些新首碼:

「f””」是格式字元串的簡寫形式。例如,「f”hello {name}”」是等效的「format_args!()」調用的簡寫形式。

「c””」或「z””」用於空終止的 C 字元串。

「k#keyword」允許編寫當前版本中尚不存在的關鍵字。例如,雖然「async」在 2015 版中不是關鍵字,但是該首碼將允許在 2015 版中以「k#async」作為替代。

8. 新的硬錯誤

在 Rust 2021 中,現有的兩個 lint 會被視為硬錯誤,在舊版本中,這些 lint 將仍然是警告。

「bare-trait-objects」:在 Rust 2021 中,必須使用「dyn」關鍵字標識特徵對象。

「ellipsis-inclusive-range-patterns」:Rust 2021 不再接受過時的「…」語法,取而代之的是「.. =」,不過表達式的使用是一樣的。

9.「micro_rules」中的 or

從 1.53.0 開始,便加入了對「|」的支持,使其可以嵌套在任何地方。例如,現在可以寫「Some(1 | 2)」,而不需要使用「Some(1) | Some(2)」這種方式。

這個改動會對「macro_rules」宏產生影響,於是在 1.53.0 中「:pat」並不與「|」相匹配。因為之前,並非在所有嵌套級別都可以包含「|」。

不過,在 Rust 2021 中,「:pat」片段說明符將匹配「A | B」。

由於有時仍然希望匹配不帶「|」的單個模式變數,因此添加了指定的片段「:pat_param」以保留舊的行為。

參考資料

Rust Blog》、《GitHub》、《開源資訊 #1》、《開源資訊 #2》、《Info Q》、《Reddit

(本文經 新智元 授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為 〈Rust 也出 2077? 最受欢迎的编程语言再度更新!〉;首圖來源:Rust Blog。)

延伸閱讀

為了讓 M1 MacBook 運行 Linux,開發者發起群眾募資
Google 推出新程式語言 Logica,要簡化超長的 SQL 程式碼!
開源支援 Linux、macOS、Windows 錯了嗎?Go 成駭客開發惡意軟體的首選程式語言


訂閱《TechOrange》每日電子報!

每天一早,需要來根知識能量棒? TechOrange 與你一起,吸收世界新知識、消化科技新局勢。點我訂閱電子報 ,取得最新深度報導。

點關鍵字看更多相關文章: