Опубликован релиз языка программирования общего назначения 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 и том, как различные структуры и языковые конструкции работают на низком уровне и какой машинный код для них генерируется.