Код
#новости

Вышел Rust 1.59.0 — теперь язык ещё надёжнее и быстрее

В релизе — встроенный ассемблер, деструктурированное присваивание, константные дефолтные параметры для дженериков и многое другое.

Спустя месяц после выхода Rust 1.58.1 разработчики выпускают новую версию — 1.59.0. В ней они поработали над производительностью и новой функциональностью. Рассмотрим главные изменения.

Встроенный ассемблер. Rust теперь поддерживает ассемблер прямо в коде. Это позволит многим приложениям контролировать их выполнение на низком уровне или получать доступ к специализированным машинным инструкциям.

Например, код для систем на архитектуре x86-64 может выглядеть так:

use std::arch::asm;

// Умножаем х на 6 с помощью сдвигов и сложений
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 поддерживает ассемблер для следующих архитектур:

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

Деструктурированное присваивание. Кортежи, срезы и шаблоны структур теперь можно использовать как левую часть присваивания. Это сделает присваивание более согласованным со связкой let. Разработчики отмечают, что деструктурирование с такими операторами, как +=, не работает.

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, 3, 4, 5], [a, b, c, d, e]);

Константные дефолтные и чередующиеся дженерики. Теперь можно указывать дефолтные значения для констант дженерик-типов. Например, так:

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],
        }
    }
}

Ранее типы параметров должны были идти перед всеми константными параметрами. Это ограничение было упрощено, чтобы позволить пользователям чередовать их.

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
{
    // ...
}

Что ещё? Разработчики предупредили о будущих сообщениях о несовместимости, сделали бинарные файлы меньше, отключили инкрементальную компиляцию по умолчанию и стабилизировали некоторые API.

Подробнее изучить все обновления можно на странице блога Rust.


Онлайн-школа для детей Skillbox Kids
Учим детей программированию, созданию игр, сайтов и дизайну. Первое занятие бесплатно! Подробности — по клику.
Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована