Выпуск Rust 1.82. Новый браузер на Rust. Использование Rust в Volvo
Опубликован релиз языка программирования общего назначения Rust 1.82, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).
Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.
Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.
Основные новшества:
В пакетный менеджер cargo добавлена команда «info» для вывода информации о пакете в репозитории.
Добавлена поддержка синтаксиса «use‹…›» в «impl Trait», определяющего информацию о скрытых типах. Например, «impl Trait + use‹'x, T›» указывает, что в скрытом типе разрешено использовать только параметры «x» и «T».
Предложен отдельный синтаксис для создания raw-указателей, пришедший на смену ранее применяемым макросам: на смену макросу «addr_of!(expr)» теперь оператор »&raw const expr», а на смену макросу «addr_of_mut!(expr)» — оператор »&raw mut expr».
struct Packed { not_aligned_field: i32, } fn main() { let p = Packed { not_aligned_field: 1_82 }; // Старый способ создания raw-указателя let ptr = std::ptr::addr_of!(p.not_aligned_field); // Новый способ создания raw-указателя let ptr = &raw const p.not_aligned_field; let val = unsafe { ptr.read_unaligned() }; }- Предоставлена возможность определения безопасных (safe) функций и констант со временем жизни 'static' внутри extern-блоков с признаком «unsafe» (ранее все элементы в «unsafe extern» могли иметь только признак «unsafe»):
unsafe extern { pub safe static TAU: f64; pub safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> usize; } Атрибуты no_mangle, link_section и export_name, которые могут привести к неопределённому поведению, теперь считаются небезопасными и требуют явной пометки признаком «unsafe», например:
#[unsafe(no_mangle)] pub fn my_global_function() { }- При сопоставлением с образцом разрешено пропускать пустые типы, такие как «enum Void {}» или структуры с видимым пустым полем.
use std::convert::Infallible; pub fn unwrap_without_panic‹T›(x: Result‹T, Infallible›) -› T { let Ok(x) = x; // "Err" можно пропустить x } В типах для чисел с плавающей запятой (f32 и f64) стандартизировано поведения при обработке нечисловых значений NaN (0.0/0.0), а также разрешено использование операций с плавающей запятой в const fn.
- В ассемблерных вставках предоставлена возможность использования операндов с признаком «const» для непосредственного использования целых числовых значений без их предварительного сохранения в регистре.
const MSG: &str = "Hello, world!\n"; unsafe { core::arch::asm!( "mov rdx, {LEN} // будет сформирована инструкций 'mov rdx, 14'", LEN = const MSG.len(), ... ); } - Разрешена адресация выражений с признаком «static» в безопасном контексте без определения блока unsafe (операторы »&raw mut» и »&raw const» не влияют на значение операнда и лишь создаёт указатель на него):
static mut STATIC_MUT: Type = Type::new(); extern "C" { static EXTERN_STATIC: Type; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; let extern_static_ptr = &raw const EXTERN_STATIC; } - В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
std::thread::Builder::spawn_uncheckedstd::str::CharIndices::offsetstd::option::Option::is_none_or[T]::is_sorted[T]::is_sorted_by[T]::is_sorted_by_keyIterator::is_sortedIterator::is_sorted_byIterator::is_sorted_by_keystd::future::Ready::into_innerstd::iter::repeat_nimpl DoubleEndedIterator for Takeimpl ExactSizeIterator for Takeimpl ExactSizeIterator for Takeimpl Default for std::collections::binary_heap::Iterimpl Default for std::collections::btree_map::RangeMutimpl Default for std::collections::btree_map::ValuesMutimpl Default for std::collections::vec_deque::Iterimpl Default for std::collections::vec_deque::IterMutRc‹T›::new_uninitRc‹T›::assume_initRc‹[T]›::new_uninit_sliceRc‹[MaybeUninit‹T›]›::assume_initArc‹T›::new_uninitArc‹T›::assume_initArc‹[T]›::new_uninit_sliceArc‹[MaybeUninit‹T›]›::assume_initBox‹T›::new_uninitBox‹T›::assume_initBox‹[T]›::new_uninit_sliceBox‹[MaybeUninit‹T›]›::assume_initcore::arch::x86_64::_bextri_u64core::arch::x86_64::_bextri_u32core::arch::x86::_mm_broadcastsi128_si256core::arch::x86::_mm256_stream_load_si256core::arch::x86::_tzcnt_u16core::arch::x86::_mm_extracti_si64core::arch::x86::_mm_inserti_si64core::arch::x86::_mm_storeu_si16core::arch::x86::_mm_storeu_si32core::arch::x86::_mm_storeu_si64core::arch::x86::_mm_loadu_si16core::arch::x86::_mm_loadu_si32core::arch::wasm32::u8x16_relaxed_swizzlecore::arch::wasm32::i8x16_relaxed_swizzlecore::arch::wasm32::i32x4_relaxed_trunc_f32x4core::arch::wasm32::u32x4_relaxed_trunc_f32x4core::arch::wasm32::i32x4_relaxed_trunc_f64x2_zerocore::arch::wasm32::u32x4_relaxed_trunc_f64x2_zerocore::arch::wasm32::f32x4_relaxed_maddcore::arch::wasm32::f32x4_relaxed_nmaddcore::arch::wasm32::f64x2_relaxed_maddcore::arch::wasm32::f64x2_relaxed_nmaddcore::arch::wasm32::i8x16_relaxed_laneselectcore::arch::wasm32::u8x16_relaxed_laneselectcore::arch::wasm32::i16x8_relaxed_laneselectcore::arch::wasm32::u16x8_relaxed_laneselectcore::arch::wasm32::i32x4_relaxed_laneselectcore::arch::wasm32::u32x4_relaxed_laneselectcore::arch::wasm32::i64x2_relaxed_laneselectcore::arch::wasm32::u64x2_relaxed_laneselectcore::arch::wasm32::f32x4_relaxed_mincore::arch::wasm32::f32x4_relaxed_maxcore::arch::wasm32::f64x2_relaxed_mincore::arch::wasm32::f64x2_relaxed_maxcore::arch::wasm32::i16x8_relaxed_q15mulrcore::arch::wasm32::u16x8_relaxed_q15mulrcore::arch::wasm32::i16x8_relaxed_dot_i8x16_i7x16core::arch::wasm32::u16x8_relaxed_dot_i8x16_i7x16core::arch::wasm32::i32x4_relaxed_dot_i8x16_i7x16_addcore::arch::wasm32::u32x4_relaxed_dot_i8x16_i7x16_add
- Признак «const», определяющий возможность использования в любом контексте вместо констант, применён в функциях:
std::task::Waker::from_rawstd::task::Context::from_wakerstd::task::Context::waker$integer::from_str_radixstd::num::ParseIntError::kind
Реализован первый уровень поддержки для платформы macOS на 64-рядных процессорах Apple Silicon на базе архтитектуры ARM64 (aarch64-apple-darwin). Первый уровень поддержки подразумевает формирование бинарных сборок проведение досконального тестирования и предоставление наивысшей гарантии поддержки платформы — каждое изменение в компиляторе проверяется выполнением полного тестового набора.
- Реализован второй уровень поддержки платформ aarch64-apple-ios-macabi и x86_64-apple-ios-macabi, отождествлённых с технологией Mac Catalyst, позволяющей запускать приложения iOS на системах Mac. Второй уровень поддержки подразумевает гарантию сборки.
Дополнительно можно отметить несколько недавних событий и проектов, связанных с языком Rust:
Представлен новый браузер Gosub, написанный на языке Rust и использующий собственный web-движок, нацеленный на поддержку HTML5 и CSS3, и не пересекающийся с проектом Servo. Для обработки JavaScript предлагается использовать внешние движки. Браузер примечателен модульной архитектурой, позволяющей на свой вкус подключать web-движки и обработчики отрисовки контента. Разработка пока находится на начальном этапе, сосредоточенном на создании компонентов для разбора HTML/CSS, организации отрисовки контента и интеграции JavaScript-движков.
Утверждается, что текущее состояние движка позволяет проходить большую часть тестов html5lib и обрабатывать почти любые документы HTML5. Парсер CSS3 и компонент отрисовки пока находятся в состоянии прототипов, способный обрабатывать только простейшие страницы. Из JavaScript-движков поддерживается v8. Код проекта доступен под лицензией MIT. Проект развивает Джошуа Тейссен (Joshua Thijssen), в прошлом активный участник сообщества разработчиков на языке PHP и автор книг про библиотеки SPL и Symfony.

Компания Volvo задействована в электромобилях EX90 и Polestar 3 электронный блок управления (ECU) на базе CPU Arm Cortex-M, отвечающий за активацию цепей питания, в котором использована прошивка, написанная на языке Rust. Проект признан удачным и руководство рассмотрит возможность расширения использования компонентов на Rust в других подсистемах. Отмечается, что по сравнению с проектами на C и C++ в коде на Rust удалось добиться более высокого качества кода меньшего уровня ошибок за счёт более жестоких требований на этапе компиляции.
Проект lm.rs подготовил написанный на Rust движок для выполнения больших языковых моделей машинного обучения, совместимый с моделями Gemma 2, Llama 3.2 и PHI 3.5, и похожий по своему назначению на llama2.c и llm.c. Lm.rs выполняет модель с использованием ресурсов CPU и не требует для работы внешних зависимостей и библиотек. Производительность lm.rs позволяет на ПК c 16-ядерным CPU AMD Epyc обрабатывать примерно 50 токенов в секунду для модели Llama 3.2 1B. Код открыт под лицензией MIT.
Опубликован выпуск платформы Tauri 2.0, предоставляющей написанный на Rust инструментарий для создания многоплатформенных пользовательских приложений с графическим интерфейсом, конкурирующий с платформой Electron. Как и в Electron логика работы приложения определяется на JavaScript, HTML и CSS, а программы оформляются в виде самодостаточных исполняемых файлов, компилируемых для различных операционных систем. Для отрисовки окон на платформе Linux используется библиотека GTK (GTK 3 Rust), а в macOS и Windows библиотека Tao. Интерфейс формируется при помощи библиотеки WRY с обвязкой над браузерным движком WebKit для macOS, WebView2 для Windows и WebKitGTK для Linux. Среди ключевых улучшений в новой версии: поддержка мобильных платформ iOS и Android, переработка слоя IPC (Inter Process Communication) и добавление большого числа новых модулей.
Разработчики свободного пакета для автоматизации проектирования печатных плат LibrePCB, оптимизированный для быстрой разработки плат и предоставления как можно более простого интерфейса, представили план по разработке выпуска 2.0. В плане упоминается интеграция поддержки использования Rust в кодовой базе и постепенное смещение при разработке от использования языка С++ в пользу Rust. Также упоминается намерение полностью переработать интерфейс пользователя, используя написанный на Rust фреймворк Slint вместо библиотеки Qt.
Разработчики проекта Rust-for-Linux работают над предоставлением возможности использования в ядре умных указателей, соответствующих модели памяти ядра Linux.
Источник: http://www.opennet.ru/opennews/art.shtml? num=62071
© OpenNet
