Випуск мови програмування Rust 1.59 за допомогою асемблерних вставок

Опубліковано реліз мови програмування загального призначення Rust 1.59, заснованого проектом Mozilla, але нині розвивається під заступництвом незалежної некомерційної організації Rust Foundation. Мова сфокусована на безпечній роботі з пам'яттю та надає засоби для досягнення високого паралелізму виконання завдань, при цьому обходячись без використання збирача сміття та runtime (runtime зводиться до базової ініціалізації та супроводу стандартної бібліотеки).

Методи роботи з пам'яттю в Rust позбавляють розробника помилок при маніпулюванні покажчиками і захищають від проблем, що виникають через низькорівневу роботу з пам'яттю, таких як звернення до області пам'яті після її звільнення, розіменування нульових покажчиків, вихід за межі буфера і т.п. Для поширення бібліотек, забезпечення збирання та управління залежностями проектом розвивається пакетний менеджер Cargo. Для розміщення бібліотеки підтримується репозиторій crates.io.

Безпечна робота з пам'яттю забезпечується в Rust під час компіляції через перевірку посилань, відстеження володіння об'єктами, облік часу життя об'єктів (області видимості) та оцінку коректності доступу до пам'яті під час виконання коду. Rust також надає засоби для захисту від цілих переповнень, вимагає обов'язкової ініціалізації значень змінних перед використанням, краще обробляє помилки в стандартній бібліотеці, застосовує концепцію незмінності посилань і змінних за умовчанням, пропонує сильну статичну типізацію для мінімізації логічних помилок.

Основні нововведення:

  • Надано можливість використання асемблерних вставок, затребуваних у додатках, яким необхідно керувати виконанням на низькому рівні або мати можливість використання спеціалізованих машинних інструкцій. Асемблерні вставки додаються за допомогою макросів «asm!» та «global_asm!» з використанням для іменування регістрів синтаксису форматування рядків, аналогічного тому, що використовується в рядкових підстановках Rust. Компілятор підтримує асемблерні інструкції для архітектур x86, x86-64, ARM, AArch64 і RISC-V. Приклад вставки: use std::arch::asm; // Multiply x 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);
  • Додано підтримку деструктурованих (паралельних) привласнень, у яких у лівій частині виразу вказується кілька типажів, слайсів чи структур. Наприклад: 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 generics): struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • У пакетному менеджері Cargo забезпечено виведення попереджень про використання у залежностях неприпустимих конструкцій, що обробляються через помилки в компіляторі (наприклад, через помилку допускалося запозичення полів упакованих структур у safe-блоках). Підтримка таких конструкцій буде припинена в майбутній версії Rust.
  • У cargo і rustc вбудована можливість генерації виконуваних файлів, очищених від налагоджувальних даних (strip = debuginfo) і символів (strip = symbols), без необхідності виклику окремої утиліти. Налаштування очищення реалізується через параметр "strip" у Cargo.toml: [profile.release] strip = "debuginfo", "symbols"
  • За замовчуванням вимкнено інкрементальну компіляцію. Як причина називається тимчасовий обхід помилки в компіляторі, що призводить до збоїв та виведення помилок десеріалізації. Виправлення помилки вже підготовлено та увійде до складу наступного випуску. Для повернення інкрементальної компіляції можна використовувати змінну оточення RUSTC_FORCE_INCREMENTAL=1.
  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано методи та реалізації типажів:
    • std::thread::available_parallelism
    • Result::copied
    • Result::cloned
    • arch::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • TryFrom for u8
    • char::TryFromCharError (Clone, Debug, Display, PartialEq, Copy, Eq, Error)
    • iter::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
    • DoubleEndedIterator для структури ToLowercase
    • DoubleEndedIterator для структури ToUppercase
    • TryFrom<&mut [T]> for [T; N]
    • UnwindSafe для структури Once
    • RefUnwindSafe для Once
    • вбудовані в компілятор функції підтримки armv8 neon для aarch64
  • Ознака «const», що визначає можливість використання в будь-якому контексті замість констант, застосована у функціях:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Джерело: opennet.ru

Додати коментар або відгук