Команда Rust рада сообщить о новой версии языка — 1.71.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если у вас есть предыдущая версия Rust, установленная через rustup
, то для обновления до версии 1.71.0 вам достаточно выполнить команду:
rustup update stable
Если у вас ещё не установлен rustup
, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.
Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta
) или nightly (rustup default nightly
) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.
Что стабилизировано в 1.71.0
C-unwind ABI
В версии 1.71.0 стабилизированы C-unwind
(и другие варианты ABI с суффиксом -unwind
[^1]).
Поведение для принудительного разматывания (в типичном сценарии) описано в этой таблице из RFC, где и была предложена эта функция. Вкратце:
Каждый ABI почти полностью эквивалентен тому же ABI без -unwind
— за исключением того, что поведение с -unwind
определено как безопасное. Это полезно, например, когда операция разматывания (возникающая при panic
или исключении в стиле C++) пересекает границу ABI. Для panic=unwind
это допустимый способ разрешить исключениям одного языка разматывать стек другого языка без завершения процесса (при условии, что исключение перехвачено тем же языком, который его породил). Для panic=abort
же это обычно немедленно прерывает процесс.
На первом этапе стабилизации мы не вносим никаких изменений в существующие ABI-интерфейсы (например, "C"
). Развёртывание между ними также остаётся с неопределённым поведением. Следующий выпуск Rust сыграет заключительную часть в стабилизации этих ABI, и их поведение будет соответствовать описанному в RFC (обычно это прерывание на границе). Пользователям рекомендуется начать использовать новые варианты ABI размотки в своём коде уже сейчас, если им требуется размотать стек через границу ABI.
Атрибуты визуализации отладчика
Версия 1.71.0 стабилизирует поддержку нового атрибута #[debug_visualizer(natvis_file = "...")]
и #[debug_visualizer(gdb_script_file = "...")]
, который позволяет встраивать описания Natvis и скрипты GDB в библиотеки Rust для улучшения работы отладчика при проверке структур данных, созданных этими библиотеками. Раньше Rust сам упаковывал аналогичные скрипты для стандартной библиотеки, но эта функция позволит авторам библиотек самим предоставлять аналогичные возможности конечным пользователям.
Более подробно об использовании можно узнать тут.
Линковка raw-dylib
На платформе Windows Rust теперь поддерживает использование функций динамических библиотек, не требуя при этом, чтобы они были доступны во время сборки. Для этого используется новая опция kind="raw-dylib"
для #[link]
.
Это позволяет избежать необходимости устанавливать эти библиотеки (что особенно сложно при кросс-компиляции) и избавляет от необходимости отправлять заглушки версий библиотек в крейтах для привязки к ним. Также это упрощает создание крейтов, обеспечивающих привязки к библиотекам Windows.
Также Rust поддерживает привязку к символам из библиотек DLL по порядковому, а не именованному символу при помощи нового атрибута #[link_ordinal]
.
Обновление musl до 1.2
Как ранее сообщалось, Rust 1.71 обновляет версию musl до 1.2.3. Большинство пользователей не будет затронуто этим изменением.
Константная инициализация thread local
В Rust 1.59.0 была стабилизирована const-
инициализация поддержки локальных потоков в стандартной библиотеке, что позволяет генерировать более оптимальный код. Однако до сих пор эта функция отсутствовала в примечаниях к выпуску и документации. Обратите внимание, что эта стабилизация не делает const { ... }
допустимым выражением или синтаксисом в других контекстах — это отдельная и пока ещё нестабильная функция.
use std::cell::Cell;
thread_local! {
pub static FOO: Cell<u32> = const { Cell::new(1) };
}
Стабилизированные API
CStr::is_empty
BuildHasher::hash_one
NonZeroI*::is_positive
NonZeroI*::is_negative
NonZeroI*::checked_neg
NonZeroI*::overflowing_neg
NonZeroI*::saturating_neg
NonZeroI*::wrapping_neg
Neg for NonZeroI*
Neg for &NonZeroI*
From<[T; N]> for (T...)
(массив в N-размерный кортеж для N в пределах 1..=12)From<(T...)> for [T; N]
(N-размерный кортеж в массив для N в пределах 1..=12)windows::io::AsHandle for Box<T>
windows::io::AsHandle for Rc<T>
windows::io::AsHandle for Arc<T>
windows::io::AsSocket for Box<T>
windows::io::AsSocket for Rc<T>
windows::io::AsSocket for Arc<T>
Следующие API теперь возможно использовать в контексте const
:
<*const T>::read
<*const T>::read_unaligned
<*mut T>::read
<*mut T>::read_unaligned
ptr::read
ptr::read_unaligned
<[T]>::split_at
Прочие изменения
Проверьте всё, что изменилось в Rust, Cargo и Clippy.
Участники 1.71.0
Многие люди собрались вместе, чтобы создать Rust 1.71.0. Без вас мы бы не справились. Спасибо!
[^1]: Список стабилизированных ABI можно найти в отчёте по стабилизации
От переводчиков
С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков.
Данную статью совместными усилиями перевели TelegaOvoshey, kunansy и funkill.