Опубликован релиз языка программирования общего назначения Rust 1.84, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные новшества:
- В пакетном менеджере Cargo стабилизирован механизм обработки зависимостей, выбирающий версии зависимых компонентов с учётом совместимости с версиями компилятора Rust, заявленными как минимально поддерживаемые проектом (MSRV, Minimum Supported Rust Version). Новая возможность позволяет избавить сопровождающих от необходимости ручного выбора старых версий каждой зависимости в проектах, сохраняющих совместимость со старыми версиями инструментария Rust. Новый режим определения зависимостей будет активирован по умолчанию в выпуске Rust 1.85, а пока доступен в формате опции, для включения которой в секции “[resolver]” в файле “.cargo/config.toml” следует указать ‘incompatible-rust-versions = “fallback”‘.
- Начат перевод компилятора на новый обработчик типов (trait solver), предназначенный для проверки границ применимости типажей, нормализации типов и оценки совместимости типов.
В версии 1.84 новый обработчик задействован для проверки согласованности реализаций типажей, т.е. оценки существования не более одного типажа для рассматриваемого типа с учётом кода из других crate-пакетов. Указанная проверка позволила избавиться от проблем в старой реализации обработчика типов, потенциально способных привести к появлению конфликтов из-за пересечения разных реализаций типажей. - Предложен новый API “Strict Provenance”, который можно использовать для приведения указателя к целому числу и обратно с учётом прикреплённых к указателю метаданных с информацией о его происхождении и области использования (помимо адреса к указателю прикрепляется значение “provenance” с информацией о связи с другими указателями, позволяющей определить где и когда указатель может обращаться к памяти). При приведении указателя к целому числу и обратно возникает неопределённое поведение из-за проблематичности отследить происхождение результирующего указателя. Новый API позволяет выполнять низкоуровневые операции с указателями, такие как сохранение дополнительной информации в младших битах указателя, без приведения указателя к целому числу.
- В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
- Ipv6Addr::is_unique_local
- Ipv6Addr::is_unicast_link_local
- core::ptr::with_exposed_provenance
- core::ptr::with_exposed_provenance_mut
- ::addr
- ::expose_provenance
- ::with_addr
- ::map_addr
- ::isqrt
- ::checked_isqrt
- ::isqrt
- NonZero::isqrt
- core::ptr::without_provenance
- core::ptr::without_provenance_mut
- core::ptr::dangling
- core::ptr::dangling_mut
- Pin::as_deref_mut
- Признак “const” применён в функциях:
- AtomicBool::from_ptr
- AtomicPtr::from_ptr
- AtomicU8::from_ptr
- AtomicU16::from_ptr
- AtomicU32::from_ptr
- AtomicU64::from_ptr
- AtomicUsize::from_ptr
- AtomicI8::from_ptr
- AtomicI16::from_ptr
- AtomicI32::from_ptr
- AtomicI64::from_ptr
- AtomicIsize::from_ptr
- ::is_null
- ::as_ref
- ::as_mut
- Pin::new
- Pin::new_unchecked
- Pin::get_ref
- Pin::into_ref
- Pin::get_mut
- Pin::get_unchecked_mut
- Pin::static_ref
- Pin::static_mut
- Стабилизирована поддержка ассемблерных inline-вставок для архитектур s390x и Arm64EC.
- Для целевой платформы WebAssembly стабилизирована поддержка функциональности multivalue, reference-types и tail-call.
- Реализован второй уровень поддержки платформы wasm32v1-none. Второй уровень поддержки подразумевает гарантию сборки.
Дополнительно можно отметить несколько проектов, связанных с Rust:
- Опубликован релиз операционной системы Tock 2.2, написанной на языке Rust и ориентированного на использование в микроконтроллерах. Система позволяет организовать одновременное выполнение нескольких не заслуживающих доверия приложений на встраиваемых устройствах, имеющих ограниченный размер ОЗУ, таких как датчики, TPM (Trusted Platform Module), брелоки аутентификации и носимые устройства. Поддерживаются платформы с микроконтроллерами на базе архитектур ARM Cortex-M и RISC-V. Ключевой особенностью Tock является изоляция уровней приложений, ядра и слоя с драйверами, а также изоляция каждого приложения и драйвера по отдельности. Для изоляции используются как возможности языка Rust, так и разделение на уровне защиты памяти.
- Проект VEKOS (Verified Experimental Kernel OS) развивает ядро операционной системы на языке Rust, обеспечивающее верификацию выполняемых компонентов. При каждой операции с файловой системой, создании процесса и выделении памяти формируется криптографическое подтверждение, позволяющее верифицировать операцию во время выполнения (реализация сравнивается с применением блокчейна для верификации действий в операционной системе). В файловой системе VKFS для обеспечения целостности и защиты от искажения задним числом задействована структура “дерево Меркла” (Merkle Tree), каждая ветка в котором верифицирует все нижележащие ветки и узлы, благодаря древовидному хешированию. Выделение памяти производится в режиме COW (Copy-On-Write).
- Группа исследователей из Microsoft и Inria развивает подмножество языка Си – Mini-C, предназначенное для автоматической трансляции программ на языке Си в представление на языке Rust. В отличие от компилятора c2rust, новый проект позволяет генерировать Rust-код без использования unsafe, но нацелен главным образом на преобразование Си-проектов, имеющих формальное доказательство надёжности. Подразумевается, что будет проще вначале перевести Си-проект в представление на Mini-C, в котором не допускаются арифметические операции с указателями, чем переписывание unsafe-блоков после прямой компиляции из Си в Rust.
Реализация компилятора базируется на инструментарии KaRaMeL. Mini-C разработан и опробован в рамках проекта по переписыванию на Rust криптографической библиотеки HACL*, для которой предоставлено формальное доказательство надёжности. Подобное доказательство было использовано для демонстрации возможности генерировать из Mini-C безопасный код на Rust.
- Дэниел Cтенберг (Daniel Stenberg), автор утилиты curl, объявил о прекращении разработки и поддержки проектом Curl альтернативного HTTP-бэкенда, написанного на Rust с использованием библиотеки Hyper. В качестве причины указано отсутствие интереса со стороны разработчиков и пользователей.
- Анонсирован бета-выпуск командной оболочки Fish 4.0, переписанный на языке Rust. Отмечается, что после двух лет разработки кодовая база Fish была полностью переведена с С++ на Rust.
Переход на Rust позволил решить проблемы с многопоточностью, получить современный инструментарий, выявляющий ошибки на этапе компиляции, повысить безопасность работы с памятью и сделать проект более привлекательным для новых разработчиков. - Проект Tor опубликовал выпуск Arti 1.3.2, альтернативной реализации Tor-клиента на языке Rust.
Arti предоставляет встраиваемую библиотеку, которую могут использовать различные приложения. При создании Arti учтён прошлый опыт разработки Tor для того, чтобы избежать известных архитектурных проблем, сделать проект более модульным и эффективным. Ветка 1.x отмечена как пригодная для использования обычными пользователями и обеспечивающая тот же уровень конфиденциальности, юзабилити и стабильности, что и основная реализация на языке Си. В новой версии продолжена разработка RPC, поведена подготовка в реализации поддержки релеев и добавлена защита от DoS-атак на Onion-сервисы. - Опубликован выпуск игрового движка Bevy 0.15, написанного на Rust. В движке применяется датацентричная модель (Data Driven) определения игровой логики, построенная поверх набора готовых компонентов Bevy ECS (Entity Component System), которые могут выполняться параллельно. Поддерживается 2D и 3D рендеринг, скелетная анимация, определение графа рендеринга, система формирования сцен, фреймворк для построения интерфейса пользователя, внесение изменений в сцены и ресурсы без необходимости перезапуска.
- Опубликован консольный текстовый редактор Helix 25.01, написанный на Rust и расширяющий идеи, заложенные в vim и neovim. Поддерживается интеграция с LSP-серверами и с Tree-sitter, одновременное выделение нескольких блоков, использование нескольких курсоров при редактировании, темы оформления, отладочный протокол DAP (Debug Adapter Protocol).
- В браузерный движок Servo, написанный на Rust, добавлена поддержка тёмного режима оформления. На 20% сокращён размер браузера ServoShell. Поддержка web-спецификаций доведена до возможность входа и чтения сообщений в Discord (отправка сообщений пока невозможна).
- Компания Mozilla представила инструментарий Uniffi for React Native для создания модулей к React Native на языке Rust.
- Проведено тестирование производительности кодировщиков изображений в формате PNG. Декодировщики на Rust (png, zune-png, wuffs) оказались быстрее декодировщиков на Си (libpng, spng, stb_image). Например, crate-пакет png (image-rs) обогнал libpng в 1.8 раза на системе x86 и в 1.5 раза на системе ARM. image-rs: 375.401 MP/s (average) 318.632 MP/s (geomean) zune-png: 376.649 MP/s (average) 302.529 MP/s (geomean) wuffs: 376.205 MP/s (average) 287.181 MP/s (geomean) libpng: 208.906 MP/s (average) 173.034 MP/s (geomean) spng: 299.515 MP/s (average) 235.495 MP/s (geomean) stb_image: 234.353 MP/s (average) 171.505 MP/s (geomean)