Опубликован релиз языка программирования общего назначения 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, в том числе стабилизированы методы и реализации типажей:
-
Default for std::collections::btree_map::{IntoIter, Iter, IterMut}
-
Default for std::collections::btree_map::{IntoValues, Values}
-
Default for std::collections::linked_list::{IntoIter, Iter, IterMut}
-
В пакетный менеджер 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 и том, как различные структуры и языковые конструкции работают на низком уровне и какой машинный код для них генерируется.
// cc-by opennet.ru
// converted with crypt’s opennet autoreposter
>>> Подробности