Выпуск Rust 1.83. Развитие инструментария Xen и табличного процессора на Rust

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

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

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

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

  • Добавлены новые возможности для кода в контексте “const”, вычисляемого на этапе компиляции и пригодного для использования вместо констант. Добавлена возможность определения с признаком “const” ссылок на значения, инициализированные с признаком “static”, при условии, что ссылка выставляется на не изменяемые статические переменные (без признака “mut”). При этом возможно использование в качестве констант raw-указателей, указывающих на изменяемый элемент. Например: static S1: i32 = 25; static mut S2: i32 = 64; const C1: &i32 = &S1; // Ok const C2: i32 = unsafe { S2 }; // ошибка const C3: &i32 = unsafe { &S2 }; // ошибка const C4: *mut i32 = &raw mut S2; // Ok
  • Разрешено использование в контексте констант изменяемых ссылок и указателей (c признаком “mut”), но подобные изменяемые ссылки и указатели допускаются только внутри блока для вычисления константы, но не могут указываться в финальном значении константы. Например: const fn inc(x: &mut i32) { *x += 1; } const C1: i32 = { let mut c = 41; inc(&mut c); c }; const C2: &mut i32 = &mut 4; // ошибка, использование в финальном значении запрещено
  • Стабилизировано применение &Cell и *const Cell в контексте констант.
  • Признак “const” применён в функциях:
    • Cell::into_inner
    • Duration::as_secs_f32
    • Duration::as_secs_f64
    • Duration::div_duration_f32
    • Duration::div_duration_f64
    • MaybeUninit::as_mut_ptr
    • NonNull::as_mut
    • NonNull::copy_from
    • NonNull::copy_from_nonoverlapping
    • NonNull::copy_to
    • NonNull::copy_to_nonoverlapping
    • NonNull::slice_from_raw_parts
    • NonNull::write
    • NonNull::write_bytes
    • NonNull::write_unaligned
    • OnceCell::into_inner
    • Option::as_mut
    • Option::expect
    • Option::replace
    • Option::take
    • Option::unwrap
    • Option::unwrap_unchecked
    • Option::<&_>::copied
    • Option::<&mut _>::copied
    • Option::>::flatten
    • Option::>::transpose
    • RefCell::into_inner
    • Result::as_mut
    • Result::<&_, _>::copied
    • Result::<&mut _, _>::copied
    • Result::, _>::transpose
    • UnsafeCell::get_mut
    • UnsafeCell::into_inner
    • array::from_mut
    • char::encode_utf8
    • {float}::classify
    • {float}::is_finite
    • {float}::is_infinite
    • {float}::is_nan
    • {float}::is_normal
    • {float}::is_sign_negative
    • {float}::is_sign_positive
    • {float}::is_subnormal
    • {float}::from_bits
    • {float}::from_be_bytes
    • {float}::from_le_bytes
    • {float}::from_ne_bytes
    • {float}::to_bits
    • {float}::to_be_bytes
    • {float}::to_le_bytes
    • {float}::to_ne_bytes
    • mem::replace
    • ptr::replace
    • ptr::slice_from_raw_parts_mut
    • ptr::write
    • ptr::write_unaligned
    • <*const _>::copy_to
    • <*const _>::copy_to_nonoverlapping
    • <*mut _>::copy_from
    • <*mut _>::copy_from_nonoverlapping
    • <*mut _>::copy_to
    • <*mut _>::copy_to_nonoverlapping
    • <*mut _>::write
    • <*mut _>::write_bytes
    • <*mut _>::write_unaligned
    • slice::from_mut
    • slice::from_raw_parts_mut
    • <[_]>::first_mut
    • <[_]>::last_mut
    • <[_]>::first_chunk_mut
    • <[_]>::last_chunk_mut
    • <[_]>::split_at_mut
    • <[_]>::split_at_mut_checked
    • <[_]>::split_at_mut_unchecked
    • <[_]>::split_first_mut
    • <[_]>::split_last_mut
    • <[_]>::split_first_chunk_mut
    • <[_]>::split_last_chunk_mut
    • str::as_bytes_mut
    • str::as_mut_ptr
    • str::from_utf8_unchecked_mut
  • В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
    • BufRead::skip_until
    • ControlFlow::break_value
    • ControlFlow::continue_value
    • ControlFlow::map_break
    • ControlFlow::map_continue
    • DebugList::finish_non_exhaustive
    • DebugMap::finish_non_exhaustive
    • DebugSet::finish_non_exhaustive
    • DebugTuple::finish_non_exhaustive
    • ErrorKind::ArgumentListTooLong
    • ErrorKind::Deadlock
    • ErrorKind::DirectoryNotEmpty
    • ErrorKind::ExecutableFileBusy
    • ErrorKind::FileTooLarge
    • ErrorKind::HostUnreachable
    • ErrorKind::IsADirectory
    • ErrorKind::NetworkDown
    • ErrorKind::NetworkUnreachable
    • ErrorKind::NotADirectory
    • ErrorKind::NotSeekable
    • ErrorKind::ReadOnlyFilesystem
    • ErrorKind::ResourceBusy
    • ErrorKind::StaleNetworkFileHandle
    • ErrorKind::StorageFull
    • ErrorKind::TooManyLinks
    • Option::get_or_insert_default
    • Waker::data
    • Waker::new
    • Waker::vtable
    • char::MIN
    • hash_map::Entry::insert_entry
    • hash_map::VacantEntry::insert_entry
  • Реализован третий уровень поддержки для платформ aarch64_unknown_nto_qnx700, arm64e-apple-tvos, armv7-rtems-eabihf, loongarch64-unknown-linux-ohos, riscv32-wrs-vxworks and riscv64-wrs-vxworks, riscv32{e|em|emc}-unknown-none-elf, x86_64-unknown-hurd-gnu и x86_64-unknown-trusty. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.
  • Требования к минимальной внешней версии LLVM подняты до ветки 18. Прекращена поддержка компилятора Visual Studio 2013.

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

  • Разработчики платформы XCP-ng, развиваемой проектом Xen, опубликовали отчёт о развитии проекта по созданию нового низкоуровневого инструментария для гипервизора Xen, написанного на языке Rust и идущего на смену libxl. Инструментарий планируют задействовать в платформе XCP-ng для низкоуровневого управления хост-окружением и гостевыми системами. В настоящее время работа сосредоточена на создании crate-пакетов на языке Rust, способных заменить Си-библиотеки из пакета xen-libs. Например, ведётся работа над созданием Rust-аналогов библиотек xenctrl и xeneventchan с реализацией интерфейса для гипервызовов Xen и каналов обработки событий.
  • Проект IronCalc развивает движок для создания табличных процессоров, написанный на языке Rust, а также сопутствующий инструментарий для работы с электронными таблицами. Движок рассчитан на встраивание в приложения на языках программирования Rust, Python и JavaScript (возможно появится поддержка R, Julia и Go). Поддерживается встраивание как пользовательского интерфейса для создания и редактирования электронных таблиц (стиль и оформление настраивается по желанию разработчиков), так и средств автоматизации работы с электронными таблицами. Предоставляются компоненты для манипуляции электронными таблицами в графическом режиме, консоли и в web-приложениях. Заявлено стремление к обеспечению полной совместимости с файлами в формате Microsoft Excel. Код проекта распространяется под лицензиями MIT и Apache 2.0. Доступна online-демонстрация, работающая в браузере.

    На текущем этапе развития IronCalc можно рассматривать как рабочий прототип, формирующий интерфейс для работы через браузер,
    поддерживающий около 200 функций, позволяющий управлять стилем и форматированием ячеек, обеспечивающий импорт и экспорт в формате xlsx, поддерживающий интеграцию с программами на Rust и Python. В версии IronCalc 1.0 планируется добиться 90% совместимости с Excel.


  • Опубликован выпуск проекта uutils coreutils 0.0.28, развивающего аналог пакета GNU Coreutils, переписанный на языке Rust. В состав coreutils входит более ста утилит, включая sort, cat, chmod, chown, chroot, cp, date, dd, echo, hostname, id, ln и ls. Целью проекта является создание кроссплатформенной альтернативной реализации Coreutils, способной работать в том числе на платформах Windows, Redox и Fuchsia. В отличие от GNU Coreutils реализация на Rust распространяется под пермиссивной лицензией MIT, вместо копилефт-лицензии GPL.

    В новой версии uutils улучшена совместимость с эталонным тестовым набором GNU Coreutils, при прохождении которого успешно выполнено 476 тестов (на 21 больше, чем в прошлой версии), 94 тестов пока не удаётся пройти. Проведена оптимизация утилит cksum, mkdir и tr. Расширены возможности, улучшена совместимость и добавлены недостающие опции для утилит basenc, cat, cksum, cp, date, dd, dircolors, echo, hashsum, hostname, join, ls, ln, mkdir, mv, od, paste, printf, runcon, sort, sync, test, uptime, users, tr, tsort, uucore.


Release. Ссылка here.