Опубликован релиз языка программирования Rust 1.95, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Методы работы с памятью в Rust нацелены на исключение ошибок при манипулировании указателями и защиту от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные новшества:
- Добавлен макрос «cfg_select!», который может применяться вместо пакета «cfg-if» для обработки нескольких условий компиляции в стиле блока «match», без определения цепочки условных выражений с конструкцией «#[cfg]». cfg_select! { unix => { fn foo() { /* unix */ } } target_pointer_width = «32» => { fn foo() { /* не-unix, 32-bit */ } } _ => { fn foo() { /* не unix и не 32-bit */ } } }
- Стабилизирована возможность указания выражений «if let» внутри блоков «match» для создания условных сопоставлений по шаблону. Ранее поддержка указания нескольких выражений «let» с использованием оператора «&&» была стабилизирована для блоков «if» и «while». match value { Some(x) if let Ok(y) = compute(x) => { println!(«{}, {}», x, y); } _ => {} }
- Стабилизирована поддержка inline-ассемблера для архитектур PowerPC и PowerPC64.
- В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
- MaybeUninit<[T; N]>: From<[MaybeUninit<T>; N]>
- MaybeUninit<[T; N]>: AsRef<[MaybeUninit<T>; N]>
- MaybeUninit<[T; N]>: AsRef<[MaybeUninit<T>]>
- MaybeUninit<[T; N]>: AsMut<[MaybeUninit<T>; N]>
- MaybeUninit<[T; N]>: AsMut<[MaybeUninit<T>]>
- [MaybeUninit<T>; N]: From<MaybeUninit<[T; N]>
- Cell<[T; N]>: AsRef<[Cell<T>; N]>
- Cell<[T; N]>: AsRef<[Cell<T>]>
- Cell<[T]>: AsRef<[Cell<T>]>
- bool: TryFrom<{integer}>
- AtomicPtr::update
- AtomicPtr::try_update
- AtomicBool::update
- AtomicBool::try_update
- AtomicIn::update
- AtomicIn::try_update
- AtomicUn::update
- AtomicUn::try_update
- cfg_select!
- mod core::range
- core::range::RangeInclusive
- core::range::RangeInclusiveIter
- core::hint::cold_path
- <*const T>::as_ref_unchecked
- <*mut T>::as_ref_unchecked
- <*mut T>::as_mut_unchecked
- Vec::push_mut
- Vec::insert_mut
- VecDeque::push_front_mut
- VecDeque::push_back_mut
- VecDeque::insert_mut
- LinkedList::push_front_mut
- LinkedList::push_back_mut
- Layout::dangling_ptr
- Layout::repeat
- Layout::repeat_packed
- Layout::extend_packed
- Признак «const» применён в функциях:
- fmt::from_fn
- ControlFlow::is_break
- ControlFlow::is_continue
- В стабильных версиях инструментария убрана поддержка передачи компилятору спецификаций собственных целевых платформ.
- Целевые платформы powerpc64-unknown-linux-musl, aarch64-apple-tvos, aarch64-apple-tvos-sim, aarch64-apple-watchos, aarch64-apple-watchos-sim, aarch64-apple-visionos и aarch64-apple-visionos-sim переведены на второй уровень поддержки, который подразумевает гарантию сборки, но отсутствие гарантий при прохождении тестового набора.
Дополнительно можно отметить недавно анонсированные проекты и события, связанные с Rust:
- Компания Canonical представила дисплейный сервер Mir 2.26, предоставляющий набор библиотек для создания композитных серверов на базе протокола Wayland и включающий типовую функциональность оконных менеджеров и дисплейных серверов. Mir задействован в таких проектах, как композитный менеджер Miracle, оболочка для интернет-киосков Ubuntu Frame и пользовательское окружение Miriway.
Новый выпуск примечателен добавлением возможности разработки компонентов на языке Rust. На Rust реализована альтернативная подсистема управления вводом evdev-rs и начата работа над написанным на Rust фронтэндом wayland-rs для Wayland. Из не связанных с Rust изменений в Mir отмечена поддержка Wayland-протоколов ext_image_copy_capture_v1 и input-triggers.
- Опубликован первый релиз анализатора трафика ayaFlow, написанного на Rust и использующего подсистему ядра Linux eBPF для перехвата сетевых пакетов (IPv4/TCP/UDP) и кадров Ethernet с минимальным влиянием на производительность. Поддерживается глубокое инспектирование протоколов прикладного уровня (L7), например, извлечение TLS SNI и DNS-запросов при анализе шифрованного трафика. Система поддерживает ведение таблицы с текущим состоянием соединений в формате DashMap, сохранение истории в SQLite и отдачу статистики через REST API для Prometheus.
- Реализована возможность создания многопоточных приложений на языке Rust, использующих функции std::thread и выполняемых на стороне GPU.
Աղբյուր: opennet.ru
