Выпуск 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::‹Option‹_››::flatten
Option::‹Result‹_, _››::transpose
RefCell::into_inner
Result::as_mut
Result::‹&_, _›::copied
Result::‹&mut _, _›::copied
Result::‹Option‹_›, _›::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.
Источник: http://www.opennet.ru/opennews/art.shtml? num=62317
© OpenNet