Хабрахабр

Выпуск Rust 1.36.0: Трейт Future, стабилизация alloc и MaybeUninit<T>

Представляю вашему вниманию перевод публикации о новой версии всеми любимого языка программирования Rust.

36. Команда по разработке языка программирования Rust рада анонсировать новую версию, 1. Rust — это язык программирования, позволяющий каждому разрабатывать надёжное и быстрое ПО. 0.

Если предыдущую версию Rust вы установили средствами rustup, получение текущей версии не составит особого труда:

$ rustup update stable

Детальный обзор данного релиза доступен на GitHub. Если у Вас всё ещё нет rustup, Вы можете получить его с соответствующей страницы на нашем сайте.

Данный релиз привнёс множество изменений, включая стабилизацию долгожданного трейта Future, крейта alloc, структуры MaybeUninit<T>, NLL для Rust 2015, новую реализацию HashMap<K, V> и поддержку флага --offline в Cargo.

Ниже описаны наиболее значительные изменения, однако вы также можете посмотреть детальный список нововведений для дополнительной осведомлённости.

36. Rust 1. 0 стабилизировал долгожданный трейт Future!

Мы надеемся, что это нововведение позволит популярным крейтам, библиотекам, и, в целом, всей экосистеме подготовиться к синтаксису async/.await, стабилизация которого планируется на недалёкое будущее.

36. До версии 1. Крейт core имел базовую функциональность (такую как Iterator и Copy) и мог быть использован в средах с #![no_std], так как он не налагал никаких требований. 0, стандартная библиотека состояла из крейтов std, core и proc_macro. Между тем, крейт std поставлял такие типы, как Box<T>, а также функциональность операционной системы (глобальный аллокатор).

36. Начиная с Rust 1. Крейт std, тем временем, реэкспортирует данные части.
0, части крейта std, зависимые от глобального аллокатора, например, Vec, сейчас доступны в крейте alloc.

В то время как программы с #![no_std], использующие крейт alloc, всё ещё требуют канала nightly, библиотеки с #![no_std] могут использовать крейт alloc в стабильном Rust.

Мы надеемся, что это будет содействовать разработке экосистемы, совместимой с #![no_std]. Также отметим, что все "обычные" программы (без #![no_std]) в своих зависимостях способны содержать описанные выше библиотеки с #![no_std].

Если вы являетесь разработчиком библиотеки, требующей примитивы аллокации для функционирования, советуем пометить свою библиотеку как совместимой с #![no_std], используя следующий синтаксис в начале файла lib.rs:

#![no_std] extern crate alloc; use alloc::vec::Vec;

Одно из использований данной функции была "ленивая" аллокация массивов. В предыдущих релизах Rust, функция mem::uninitialized разрешала вам отменять проверки инициализации, так как полагала, что вы УЖЕ выполнили инициализацию типа T, не делая ничего.

Однако mem::uninitalized является чрезмерно опасной операцией, которая не может быть правильно использована с компилятором Rust, предполагающим, что все значения проинициализированы должным образом.

Например, вызов mem::uninitialized::<bool>() немедленно вызовет неопределённое поведение, так как с точки зрения Rust, неинициализированные биты являются либо нулём (false), либо единицей (true), и лишь два вышеописанных паттерна подходят для типа bool.

36. Чтобы разрешить данную ситуацию, в Rust 1. Компилятор Rust теперь не предполагает, что MaybeUninit<T> является инициализированным типом T. 0 был стабилизирован тип MaybeUninit<T>. Тем самым, вы можете выполнять постепенную инициализацию более безопасно и наконец-то использовать .assume_init() когда вы уверены, что maybe_t: MaybeUninit<T> содержит инициализированный тип T.

38, функция mem::uninitialized будет помечена устаревшей. Так как MaybeUninit<T> является более безопасной альтернативой, начиная с Rust 1.

Стандартная библиотека также содержит достаточную документацию о MaybeUninit<T>. Чтобы узнать больше о неинициализированной памяти, mem::uninitialized и MaybeUninit<T>, почитайте статью Алексиса Бессесснера.

31. В объявлении о Rust 1. Например, теперь вы можете написать так: 0 мы рассказали вам о NLL (нелексические лайфтаймы), нововведении в язык, делающим проверятеля ссылок (borrow checker) умнее и дружелюбнее.

fn main() { let mut x = 5; let y = &x; let z = &mut x; // Не было разрешено до 1.31.0
}

31. В 1. Это было сделано в Rust 1. 0, NLL был стабилизирован только для Rust 2018, и предполагалось, что мы перенесём его в Rust 2015 в будущем. 0, NLL стал доступным для Rust 2015. 36.

Однако старый проверятель ссылок, к сожалению, принял некорректный код, который он НЕ должен был принять. С NLL, поддерживаемым в обеих версиях, мы приближаемся к удалению старого проверятеля ссылок.

Советуем взглянуть на список пострадавших публичных крейтов. И, как результат, NLL сейчас находится на стадии "миграции", в которой мы будем выдавать предупреждения вместо ошибок в том случае, если проверятель ссылок NLL не одобрит код, который бы одобрил старый проверятель ссылок на основе AST.

Чтобы узнать больше о NLL, MIR, истории о правке "беззвучных дыр", и о том, что вы можете сделать с предупреждениями компилятора, прочтите статью Феликса Клока.

36. В Rust 1. Интерфейс остался прежним, но нынешняя реализация в среднем быстрее и потребляет меньше памяти. 0, предыдущая реализация HashMap<K, V> была заменена реализацией из крейта hashbrown, основанной на дизайне SwissTable. Однако заметьте, что стандартная реализация всё ещё использует алгоритм SipHash 1-3.

Однако, в некоторых моментах, например, когда новая зависимость была добавлена, Cargo всё-же будет пытаться получить доступ к сети. Во время большинства сборок, Cargo не использует вашу сеть. Иногда такое поведение недопустимо (в изолированной системе или в самолёте).

36. В Rust 1. Данный флаг отменяет алгоритм разрешения зависимостей, вместо этого используя локальные закешированные зависимости. 0, новый флаг --offline был стабилизирован.

Чтобы предварительно заполнить локальный кеш до ухода из сети, используйте команду cargo fetch, загружающую все необходимые зависимости для конкретного проекта. Если запрашиваемые крейты недоступны без сети, которая была отключена, то Cargo завершит работу с ошибкой.

Другие изменения в Cargo детально описаны тут. Чтобы узнать больше о --offline и cargo fetch, прочтите статью Ника Камерона.

  • Макрос dbg! стал поддерживать множественные аргументы;

  • Некоторые методы были помечены словом const:

  • Стабилизированы некоторые API, включая:

36. Подробные описания изменений в версии 1. 0 доступны для Rust, стандартной библиотеки, Cargo и Clippy.

36. Множество людей собрались вместе, чтобы создать Rust 1. Мы не смогли бы сделать это без всех вас, спасибо! 0.

С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов.

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»