Rust團隊釋出最新的Rust 1.38,支援工作管線編譯(Pipelined Compilation),提升了平行化處理的能力,也為巨集擴充了#[deprecated]屬性,並且會為錯誤使用mem::{uninitialized, zeroed}語法的用例發出警告。

由於在編譯Crate的時候,編譯器不需要完整的相依項目就可以進行建置,其需要的資訊僅是類型、相依項目以及輸出等元資料,而這些元資料都在編譯過程的初期產生,因此從Rust 1.38版本開始,Cargo將在元資料準備就緒之後,自動開始建置Crate。

開發者不需要更動任何程式碼,就能夠使用這項新功能,官方提到,這項更改對於單個Crate的建置沒有任何影響,但是測試實驗顯示,部分Crate圖(Graph)的建置,可以提高10到20%的編譯速度,對於其他編譯工作則改進幅度不大,速度提升的程度取決於執行建置所使用的硬體。

Rust團隊在Rust 1.36版本釋出時提到,由於根本的原因,開發者不可能安全地使用std::mem::uninitialized語法,因此開發者應該以MaybeUninit<T>代替,且避免使用std::mem::uninitialized,不過現在Rust終究尚未棄用mem::uninitialized,因此rustc現在會為mem :: uninitialized或mem :: zeroed初始化錯誤提供Linting功能。

部分類型當包含全零位元模式的行為未被定義時,由於這些類型所代表的類指標物件不可為null,因此當使用mem::uninitialized和mem::zeroed初始化這些類型時,便會出現錯誤,而新的Lint現在會發出警告。不過,由於Rust中仍有許多不為零的類型,因此開發者還是可以使用mem::uninitialized和mem::zeroe,來初始化這些結構。Rust團隊提到,這些檢查並不會針對所有使用mem::uninitialized和mem::zeroed的情況,只會辨識確定會出現錯誤的程式碼。

Rust在1.9版本的時候,加入了#[deprecated]屬性,讓Crate作者可以知會使用者,Crate中即將要棄用的項目,而在Rust 1.38中擴充了這個屬性,現在開發者可以使用std::any::type_name新函式,以獲取類型的名字,像是在執行期間,查看實例化類型參數的具體類型。

官方表示,這是一個除錯用的標準函式庫函式,不能保證字串的明確內容和格式,回傳的值只是該類型的最佳描述,多個類型可能共用相同的type_name值,而這個值在未來編譯器版本可能會變更。


Advertisement

更多 iThome相關內容