Выпуск Rust 1.88. Операционная система Munal и утилита Rsched на Rust

Опубликован релиз языка программирования общего назначения Rust 1.88, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).

Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.

Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами, учёт времени жизни объектов (области видимости) и оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.

Основные новшества:

  • Добавлена возможность указания нескольких выражений “let” внутри условных блоков “if” и “while” с использованием для их объединения оператора “&&” (логическое И). Выражения “let” могут комбинироваться с булевыми условными выражениями. Переменные, объявленные в let-выражениях, можно использовать в последующих условных выражениях, а также внутри блоков “if” и “while”. if let Channel::Stable(v) = release_info() && let Semver { major, minor, .. } = v && major == 1 && minor == 88 {
  • Добавлена поддержка написания “голых” функций, помечаемых атрибутом “#[unsafe(naked)]” и содержащих внутри один вызов “naked_asm!”. У созданных подобным образом функций отсутствует эпилог и пролог, сгенерированный компилятором, что позволяет разработчику полностью контролировать служебный ассемблерный код, прикрепляемый к функции (“голая” функция содержит только ассемблерные инструкции, указанные разработчиком и не включает специальные обработчики аргументов и возвращаемых значений, добавляемые компилятором).
    “Голые” функции рассматриваются как более удобная альтернатива функциям, определяемым в блоке “global_asm!”. #[unsafe(naked)] pub unsafe extern “sysv64” fn wrapping_add(a: u64, b: u64) -> u64 { core::arch::naked_asm!( “add rax, rdi, rsi”, “ret” ); }
  • В язык предикатов, применяемый в атрибутах условной компиляции “cfg” и “cfg_attr” (позволяют включать или отключать части кода в зависимости от заданных условий), добавлена поддержкабулевых литералов “true” и “false”, которые отождествлены с конфигурациями, которые всегда включены или всегда отключены. Данные литералы также можно использовать в макросе “cfg!” и таблицах “[target]” в манифестах и конфигурациях для Cargo. Выражения cfg(true) и cfg(false) могут применяться вместо cfg(all()) и cfg(any()) для более явного выражения своих намерений.
  • В пакетном менеджере Cargo включён автоматический запуск сборщика мусора для очистки кэша в домашнем каталоге пользователя. Ранее сохраняемые в кэше пакеты с загружаемыми зависимостями не очищались, что приводило к постоянному росту потребления дискового пространства. Включённый механизм сборки мусора будет автоматически удалять загруженные извне crate-файлы, к которым не было обращений более 3 месяцев, и локально установленные crate-файлы, к которым не обращались более месяца. Очиска кэша не запускается при использовании в crage опций “–offline” или “–frozen”.
  • В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
    • Cell::update
    • impl Default for *const T
    • impl Default for *mut T
    • mod ffi::c_str
    • HashMap::extract_if
    • HashSet::extract_if
    • hint::select_unpredictable
    • proc_macro::Span::line
    • proc_macro::Span::column
    • proc_macro::Span::start
    • proc_macro::Span::end
    • proc_macro::Span::file
    • proc_macro::Span::local_file
    • <[T]>::as_chunks
    • <[T]>::as_rchunks
    • <[T]>::as_chunks_unchecked
    • <[T]>::as_chunks_mut
    • <[T]>::as_rchunks_mut
    • <[T]>::as_chunks_unchecked_mut
  • Признак “const” применён в функциях:
    • NonNull::replace
    • <*mut T>::replace
    • std::ptr::swap_nonoverlapping
    • Cell::replace
    • Cell::get
    • Cell::get_mut
    • Cell::from_mut
    • Cell::as_slice_of_cells
  • Удалён второй уровень поддержки для целевой платформы i686-pc-windows-gnu.

Дополнительно можно отметить связанные с Rust события:

  • Проект Munal OS развивает экспериментальную операционную систему, написанную на Rust и основанную на концепции unikernel. В Munal OS не применяется вытесняющая многозадачность, маппинг страниц памяти и виртуальное адресное пространство (используется раскладка памяти от UEFI). Ядро и приложения выполняются в одном адресном пространстве с применением модели безопасности на базе sandbox-изоляции WASM (в состав входит движок wasmi для запуска приложений в форме байткода WebAssembly).

    Операционная система оснащена графическим интерфейсом и поддерживает управление через клавиатуру и мышь. Для разработки графических приложений используется собственный тулкит с библиотекой виджетов. Для сетевого взаимодействия предлагаются TCP-стек и драйвер сетевого устройства. Среди доступных для Munal OS приложений: web-браузер с базовой поддержкой HTML и HTTPS, текстовый редактор и терминал для выполнения кода на Python. Код открыт под лицензией MIT.


  • Состоялся выпуск ядра Asterinas 0.15.2, написанного на Rust и предоставляющего ABI, совместимый с ядром Linux. Ядро поддерживает архитектуры x86-64 и RISC-V, и реализует 206 из 368 системных вызовов Linux. В развитии ядра принимают участи 45 разработчиков, в основном из различных китайских университетов. Ядро построено с использованием архитектуры “framekernel”, в которой компоненты ядра размещаются в общем адресном пространстве, а безопасность достигается на уровне логического разделения безопасного кода и кода, в котором не исключено возникновение проблем с безопасностью. Все системные вызовы, файловые системы и драйверы реализуются на уровне OS Services и не могут включать unsafe-блоки. Код распространяется под лицензией MPL 2.0.
  • Для ядра Linux подготовлена утилита rsched, позволяющая анализировать статистику о работе планировщика задач. На практике утилита позволяет оценивать решения планировщика, связанные с предоставлением ресурсов процессам, а также отслеживать возникающие при планировании задержки. Для сбора данных в ядре используется подсистема BPF, а работающий в пространстве пользователя инструментарий написан на Rust. Автором утилиты является Крис Мейсон (Chris Mason), создатель и главный архитектор файловой системы Btrfs.
  • Компания Collabora сообщила о разработке варианта инструментария Coccinelle для языка Rust. Coccinelle изначально предназначен для автоматизации поиска и преобразования кода на языке Си в ядре Linux. Преобразования задаются в форме правил, напоминающих абстрагированные патчи, не привязанные к конкретной позиции в коде.
  • Разработчики GNOME представили библиотеку для загрузки изображений glycin, написанную на языке Rust и обеспечивающую декодирование изображений с применением sandbox-изоляции. Поддерживается отдача декодированного контента через gdk::Textures и извлечение метаданных.
    Предоставляются обвязки для использования glycin в GTK4, а также бэкенд для задействования glycin в библиотеке GdkPixbuf, применяемой в GNOME для загрузки изображений. Glycin уже задействован в просмотрщике изображений Loupe, предлагаемом в GNOME по умолчанию. При этом бэкенд для GdkPixbuf даёт возможность использовать glycin в GNOME Shell, генераторах миниатюр и произвольных приложениях GNOME, без внесения изменений в эти программы.

Release. Ссылка here.