發布 Rust 1.59 程式語言,支援彙編插入

Rust 1.59 通用編程語言的發布已經發布,該語言由 Mozilla 項目創建,但現在由獨立的非營利組織 Rust 基金會贊助開發。 該語言專注於內存安全,並提供實現高作業並行性的方法,同時避免使用垃圾收集器和運行時(運行時減少為標準庫的基本初始化和維護)。

Rust 的內存處理方法使開發人員在操作指針時避免錯誤,並防止由於低級內存處理而出現的問題,例如在內存區域被釋放後訪問它、取消引用空指針、緩衝區溢出等。 為了分發庫、提供構建和管理依賴項,該項目開發了 Cargo 包管理器。 crates.io 存儲庫支持託管庫。

Rust 在編譯時通過引用檢查、跟踪對象所有權、跟踪對像生命週期(範圍)以及評估代碼執行期間內存訪問的正確性來提供內存安全。 Rust 還提供防止整數溢出的保護,要求在使用前強制初始化變量值,更好地處理標準庫中的錯誤,默認應用不可變引用和變量的概念,提供強靜態類型以最小化邏輯錯誤。

主要創新:

  • 可以使用彙編語言插入,這在需要控制低階執行或能夠使用專用機器指令的應用程式中是必需的。使用巨集“asm!”新增組件插入和“global_asm!”使用字串格式化語法來命名暫存器,類似於 Rust 中的字串替換。此編譯器支援 x86、x86-64、ARM、AArch64 和 RISC-V 架構的彙編指令。插入範例:使用 std::arch::asm; // 使用移位將 x 乘以 6 並相加 let mut x: u64 = 4;不安全{ asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "add {x}, {tmp}", x = inout( reg ) x, tmp = out(reg) _, ); (x, 4 * 6);
  • 新增了對解構(並行)賦值的支持,其中在表達式的左側指定多個特徵、切片或結構。例如:let(a,b,c,d,e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5];結構體 { e, .. } = 結構體 { e: 5, f: 3 }; assert_eq!([1],[a,b,c,d,e]);
  • 可以為 const 泛型指定預設值: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • Cargo 套件管理員提供有關在由於編譯器錯誤而處理的依賴項中使用無效結構的警告(例如,由於錯誤,允許在安全性區塊中藉用打包結構的欄位)。 Rust 的未來版本將不再支援此類構造。
  • Cargo 和 rustc 具有內建功能,可產生移除偵錯資料 (strip = "debuginfo") 和符號 (strip = "symbols") 的可執行文件,而無需呼叫單獨的實用程式。清理設定是透過 Cargo.toml 中的“strip”參數實現的: [profile.release] strip = “debuginfo”, “symbols”
  • 增量編譯預設是關閉的。據說原因是編譯器中導致崩潰和反序列化錯誤的錯誤的臨時解決方法。錯誤修復已經準備就緒,並將包含在下一個版本中。若要返回增量編譯,可以使用環境變數 RUSTC_FORCE_INCRMENTAL=1。
  • API 的新部分已移至穩定類別,包括特性的方法和實現已穩定:
    • std::thread::available_parallelism
    • 結果::已複製
    • 結果::克隆
    • 拱門::彙編!
    • 拱門::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • 嘗試從 u8 開始
    • char::TryFromCharError(複製、偵錯、顯示、PartialEq、複製、Eq、錯誤)
    • 迭代器::zip
    • NonZeroU8::is_power_of_two
    • NonZeroU16::is_power_of_two
    • NonZeroU32::is_power_of_two
    • NonZeroU64::is_power_of_two
    • NonZeroU128::is_power_of_two
    • ToLowercase 結構的 DoubleEndedIterator
    • ToUppercase 結構的 DoubleEndedIterator
    • TryFrom 為 [T; ]
    • Once 架構的 UnwindSafe
    • RefUnwindSafe 一次
    • aarch8 編譯器內建的 armv64 neon 支援函數
  • “const”屬性決定了在任何上下文中使用它而不是常量的可能性,用於函數中:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

來源: opennet.ru

添加評論