20 февраля 2025 года состоялся релиз языка программирования Rust 1.85. Этот выпуск обозначен как Rust 2024. Такое решение делает стабилизацию изменений, предложенных за последние три года. Редакция языка Rust 2024 станет основой для наращивания функциональности в последующие три года, по аналогии с тем, как выпуск Rust 2021 стал базисом для развития языка в прошедшие три года. Версии проекта Rust 1.80 вышла в июле 2024 года.
Для сохранения совместимости разработчики могут использовать в своих программах метки 2015, 2018, 2021 и 2024, позволяющие привязать программы к срезам состояния языка, соответствующим выбранным редакциям Rust. Редакции были введены для разделения несовместимых изменений и настраиваются в метаданных cargo‑пакетов через поле edition в секции [package].
Например, редакция 2021 включает стабилизированную на конец 2021 года функциональность и охватывает все дальнейшие изменения, не нарушающие совместимость. Редакция 2024 дополнительно включает нарушающие совместимость новшества, предложенные в текущем выпуске 1.85 и утверждённые для реализации в будущем. Кроме самого языка редакции также учитывают состояние инструментария и документации. Для автоматической адаптации кода к новой редакции языка может использоваться команда cargo fix.
По информации OpenNET, язык Rust сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные изменения и дополнения в Rust 1.85:
добавлена поддержка асинхронно выполняемых замыканий, определяемых в форме «async || {}» и работающих по аналогии с асинхронным вызовом функций (async fn);
добавлен атрибут «#[diagnostic::do_not_recommend]», при котором компилятор не будет показывать аннотированные реализации типажей в диагностических сообщениях;
предоставлена возможность использования типажей FromIterator и Extend с кортежами, содержащими до 12 элементов — начиная с «(T,)» и заканчивая «(T1, T2, .., T11, T12)»;
реализован второй уровень поддержки платформы powerpc64le-unknown-linux-musl. Второй уровень поддержки подразумевает гарантию сборки.
Основные несовместимости, зафиксированные в Rust 2024:
изменено поведение при захвате параметров в «impl Trait», если не используется новый синтаксис «use», определяющий информацию о скрытых типах. В Rust 2024 если «use» не используется все параметры в области видимости неявно захватываются. Если необходимо ограничить захват параметров, следует использовать «use», например, «impl Trait + use» указывает, что в скрытом типе разрешено использовать только параметры «x» и «T»;
в выражениях «if let» изменена область видимости временных значений, полученных в результате выполнения выражения. При выполнении «if let $pat = $expr {.. } else {.. }» временные значения, полученные в блоке $expr, теперь будут удалены до переключения на блок «else», а не после обработки «else {.. }»;
изменена область видимости временных значениях в хвостовых выражениях, завершающих выполнение функции, блока или замыкания. Подобные значения теперь сбрасываются до локальных переменных (раньше они могли сохраняться дольше, чем сам блок и определённые в нём локальные переменные);
запрещены некоторые неоднозначно трактуемые разработчиками варианты применения mut, ref, ref mut, & и &mut в шаблонах, например, вместо «let [x, mut y] = &[(), ()];» следует писать «let &[ref x, mut y] = &[(), ()];»;
блоки «extern» обязательно должны помечаться ключевым словом «unsafe»;
атрибуты export_name, link_section и no_mangle должны помечаться ключевым словом «unsafe»;
включено по молчанию предупреждение «unsafe_op_in_unsafe_fn» для проверки обрамления блоками «unsafe {}» кода, используемого в unsafe‑функциях;
запрещено выставлять ссылки на элементы, определённые как «static mut»;
Lint‑проверка «never_type_fallback_flowing_into_unsafe» по умолчанию переключена в режим «deny»;
в спецификатор «expr» добавлена поддержка выражений «const» и «_»;
Lint‑проверка «missing_fragment_specifier» переведена в режим вывода ошибки;
зарезервировано ключевое слово «gen», которое в будущем планируют использовать для генераторов;
зарезервирован стиль определения строк ‘#»foo»#’ и токены ‘##’;
в стандартной библиотеке в число автоматически импортируемых типажей добавлены Future и IntoFuture. В структуру «Box»добавлен типаж IntoIterator. Помечены ключевым словом unsafe функции std::env::set_var, std::env::remove_var и std::os::unix::process::CommandExt::before_exec;
в пакетном менеджере Cargo включён по умолчанию новый механизм обработки зависимостей, выбирающий версии зависимых компонентов с учётом совместимости с версиями компилятора Rust, заявленными как минимально поддерживаемые проектом (MSRV, Minimum Supported Rust Version). Удалены некоторые устаревшие ключи в Cargo.toml. В зависимости запрещено использование режима «default‑features = false», если она унаследована от пакета со значением «default‑features = true» или без параметра «default‑features»;
в Rustdoc тесты doctest объединены в один исполняемый файл. При включении doctest через «include_str!» файловый путь теперь вычисляется относительно Markdown‑файла, а не файла с кодом;
в Rustfmt предложена концепция редакций стиля форматирования. Изменена логика сортировки идентификаторов.
В разработке проекта Rust 1.85 приняли участие 742 разработчика.
Источник: habr.com