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

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

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

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

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

  • В репозитории пакетов crates.io по умолчанию задействован протокол
    “sparse”, реализующий новый способ работы с индексом, в котором отражены доступные версии всех существующих в репозитории пакетов. Новый протокол позволяет существенно повысить скорость работы с crates.io и решить проблемы с масштабированием при дальнейшем росте числа пакетов в репозитории. Для сокращения задержек, возникающих из-за загрузки полного индекса, в Sparse вместо доступа к индексу с использованием Git задействована прямая загрузка по HTTPS только необходимых индексных данных, охватывающих зависимости конкретного проекта. Для отдачи индексных данных задействован сервис index.crates.io. Для возвращения старого протокола можно использовать настройку “registries.crates-io.protocol”.
  • Стабилизированы структуры OnceCell и OnceLock, реализующие возможность одноразовой инициализации совместно используемых данных (записать значение можно только один раз). use std::cell::OnceCell; let cell = OnceCell::new(); assert_eq!(cell.set(92), Ok(())); assert_eq!(cell.set(62), Err(62));
  • Стабилизирован типаж IsTerminal, предлагающий метод is_terminal для определения связи файлового дескриптора с терминалом или TTY. use std::io::{stdout, IsTerminal}; fn main() { let use_color = stdout().is_terminal(); // если терминал, то можно использовать коды цвета }
  • В опции “-Cdebuginfo” появилась возможность указания уровней вывода отладочной информации не только в цифровом виде, но в форме строковых имён (“none” – идентично уровню 0, “limited” – 1 и “full” – 2). Также добавлены два новых уровня “line-directives-only” и “line-tables-only”.
  • В стабильных и бета-сборках в интерфейсе командой строки пакета test запрещено использование нестабильных опций тестирования, включаемых при указании -Zunstable-options, которые теперь можно использовать только в ночных сборках.
  • В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
    • NonZero*::MIN/MAX
    • BinaryHeap::retain
    • Default for std::collections::binary_heap::IntoIter
    • Default for std::collections::btree_map::{IntoIter, Iter, IterMut}
    • Default for std::collections::btree_map::{IntoKeys, Keys}
    • Default for std::collections::btree_map::{IntoValues, Values}
    • Default for std::collections::btree_map::Range
    • Default for std::collections::btree_set::{IntoIter, Iter}
    • Default for std::collections::btree_set::Range
    • Default for std::collections::linked_list::{IntoIter, Iter, IterMut}
    • Default for std::vec::IntoIter
    • Default for std::iter::Chain
    • Default for std::iter::Cloned
    • Default for std::iter::Copied
    • Default for std::iter::Enumerate
    • Default for std::iter::Flatten
    • Default for std::iter::Fuse
    • Default for std::iter::Rev
    • Default for std::slice::Iter
    • Default for std::slice::IterMut
    • Rc::into_inner
    • Arc::into_inner
    • std::cell::OnceCell
    • Option::is_some_and
    • NonNull::slice_from_raw_parts
    • Result::is_ok_and
    • Result::is_err_and
    • std::sync::atomic::Atomic*::as_ptr
    • std::io::IsTerminal
    • std::os::linux::net::SocketAddrExt
    • std::os::unix::net::UnixDatagram::bind_addr
    • std::os::unix::net::UnixDatagram::connect_addr
    • std::os::unix::net::UnixDatagram::send_to_addr
    • std::os::unix::net::UnixListener::bind_addr
    • std::path::Path::as_mut_os_str
    • std::sync::OnceLock
  • В пакетный менеджер cargo добавлена команда “cargo logout” для удаления токена доступа к API из локального реестра. В команду “cargo install” добавлена опция “–ignore-rust-version”.
  • Компилятор переведён на использование LLVM 16.
  • Реализован третий уровень поддержки для платформ loongarch64-unknown-linux-gnu и i586-pc-nto-qnx700 (QNX Neutrino RTOS 7.0). Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.

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

Release. Ссылка here.