Выпуск языка программирования Rust 1.73

Опубликован релиз языка программирования общего назначения Rust 1.73, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).

Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.

Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.

Основные новшества:

  • Переработано оформление сообщений, выдаваемых применяемым по умолчанию обработчиком аварийного завершения программы (panic). Текст, указанный в макросе “panic!” теперь показывается в отдельной строке без обрамления кавычками, что упрощает читаемость сообщения и устраняет путаницу при наличии в вложенных кавычек или разделения на несколько строк. fn main() { let file = “ferris.txt”; panic!(“oh no! {file:?} not found!”); }
    Было thread ‘main’ panicked at ‘oh no! “ferris.txt” not found!’, src/main.rs:3:5
    Стало thread ‘main’ panicked at src/main.rs:3:5: oh no! “ferris.txt” not found!

    Также переработан вывод сообщений, показываемых при срабатывании макросов “assert_eq” и “assert_ne”.

    fn main() { assert_eq!(“🦀”, “🐟”, “ferris is not a fish”); }
    Было thread ‘main’ panicked at ‘assertion failed: ‘(left == right)’ left: ‘”🦀”‘, right: ‘”🐟”‘: ferris is not a fish’, src/main.rs:2:5
    Cтало thread ‘main’ panicked at src/main.rs:2:5: assertion ‘left == right’ failed: ferris is not a fish left: “🦀” right: “🐟”

  • В соответствии с RFC 3184 добавлена возможность прямой манипуляции локальными для потока (thread_local) ключами хранилища LocalKey> и LocalKey> через использование методов get(), set(), take() и replace(), вместо использования замыкания “with(|inner| …)”, что позволяет не выполнять дополнительный код инициализации для значений по умолчанию, указанных для новых потоков при помощи макроса “thread_local!”. thread_local! { static THINGS: Cell> = Cell::new(Vec::new()); } fn f() { // было THINGS.with(|i| i.set(vec![1, 2, 3])); // стало THINGS.set(vec![1, 2, 3]); // … // было let v = THINGS.with(|i| i.take()); // стало let v: Vec = THINGS.take(); }
  • В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
    • Unsigned {integer}::div_ceil
    • Unsigned {integer}::next_multiple_of
    • Unsigned {integer}::checked_next_multiple_of
    • std::ffi::FromBytesUntilNulError
    • std::os::unix::fs::chown
    • std::os::unix::fs::fchown
    • std::os::unix::fs::lfchown
    • LocalKey::>::get
    • LocalKey::>::set
    • LocalKey::>::take
    • LocalKey::>::replace
    • LocalKey::>::with_borrow
    • LocalKey::>::with_borrow_mut
    • LocalKey::>::set
    • LocalKey::>::take
    • LocalKey::>::replace
  • Признак “const”, определяющий возможность использования в любом контексте вместо констант, применён в функциях:
    • rc::Weak::new
    • sync::Weak::new
    • NonNull::as_ref
  • В компиляторе обеспечена запись информации о версии в секцию “.comment” по аналогии с GCC и Clang.
  • Реализован третий уровень поддержки для платформ aarch64-unknown-teeos, csky-unknown-linux-gnuabiv2, riscv64-linux-android, riscv64gc-unknown-hermit, x86_64-unikraft-linux-musl и x86_64-unknown-linux-ohos. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.
  • Реализован второй уровень поддержки целевой платформы wasm32-wasi-preview1-threads. Второй уровень поддержки подразумевает гарантию сборки.

Release. Ссылка here.