Rust 1.59.0 穩定版釋出,正式支援內聯組合

2022-02-26 09:00:21

Rust 1.59.0 穩定版,新版本最值得關注的特性是支援在程式碼中內聯組合 (Inline assembly),其他變化包括:引入解構式賦值、預設關閉增量編譯,以及 Const 泛型引數支援設定預設值等。

內聯組合 (Inline assembly)

此項特性的使用場景主要是控制底層執行,或者存取特定的機器指令

例如面向 x86-64 目標平臺進行編譯時,可以用以下的方式編寫程式碼:

use std::arch::asm;

// Multiply x by 6 using shifts and adds
let mut x: u64 = 4;
unsafe {
    asm!(
        "mov {tmp}, {x}",
        "shl {tmp}, 1",
        "shl {x}, 2",
        "add {x}, {tmp}",
        x = inout(reg) x,
        tmp = out(reg) _,
    );
}
assert_eq!(x, 4 * 6);

可以看到,此處格式化字串的語法與 Rust 格式化字串中使用的相同,除了asm!global_asm!宏也支援這種用法。

內聯組合中使用的組合語言和指令取決於目標架構。目前 Rust 編譯器支援以下架構的內聯組合:

  • x86 & x86-64
  • ARM
  • AArch64
  • RISC-V

點此檢視  和 

解構式賦值 (Destructuring assignments)

通過此項特性,支援在賦值語句的左側等式使用元組、切片和結構體模式 (struct patterns)。

let (a, b, c, d, e);

(a, b) = (1, 2);
[c, .., d, _] = [1, 2, 3, 4, 5];
Struct { e, .. } = Struct { e: 5, f: 3 };

assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);

不過要注意使用 +=運運算元的賦值語句尚未支援解構式賦值。

Const 泛型引數支援設定預設值

支援為 Const 泛型引數設定預設值,如下:

struct ArrayStorage<T, const N: usize = 2> {
    arr: [T; N],
}

impl<T> ArrayStorage<T> {
    fn new(a: T, b: T) -> ArrayStorage<T> {
        ArrayStorage {
            arr: [a, b],
        }
    }
}

在此前的版本中,型別引數必須要放在所有 const 引數之前,目前此限制已放寬,支援將它們交替排列使用。

fn cartesian_product<
    T, const N: usize,
    U, const M: usize,
    V, F
>(a: [T; N], b: [U; M], f: F) -> [[V; N]; M]
where
    F: FnMut(&T, &U) -> V
{
    // ...
}

預設關閉增量編譯

Rust 1.59.0 版本已預設禁用增量編譯功能(可通過環境變數顯式地啟用:RUSTC_FORCE_INCREMENTAL=1 ),此項變更降低了已知 bug  的影響,該 bug 會導致在增量編譯過程中引發反序列化錯誤和 panic。

開發團隊表示,他們會在 1.60.0 版本修復這個 bug(六週內),屆時如果沒有出現意外問題,增量編譯會重新設定為預設啟用。

穩定的 API 列表

部分方法和 trait 實現已穩定化,。

下載地址:

展開閱讀全文