Выпуск языка программирования Rust 1.76

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

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

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

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

  • В документацию добавлена отдельная секция, описывающая совместимость различных типов аргументов и типов возвращаемых значений функций на уровне ABI. По сравнению с прошлыми версиями гарантирована совместимость на уровне ABI типов «char» и «u32», которые имеют идентичный размер и выравнивание.

  • В дополнение к ранее доступному вызову «any: type_name: ‹T›()», возвращающему строковое описание для типа, указанного в параметре «T», добавлена функция «type_name_of_val (&T)» позволяющая получить информацию о типе на основе любой неименованной ссылки.
       fn get_iter() -> impl Iterator‹Item = i32› {
           [1, 2, 3].into_iter()
       }
    
       fn main() {
           let iter = get_iter();
           let iter_name = std::any::type_name_of_val(&iter);
           let sum: i32 = iter.sum();
           println!("The sum of the `{iter_name}` is {sum}.");
       }   
    
    На выходе получим:
    
       The sum of the `core::array::iter::IntoIter‹i32, 3›` is 6.
    
  • В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
    • Arc::unwrap_or_clone
    • Rc::unwrap_or_clone
    • Result::inspect
    • Result::inspect_err
    • Option::inspect
    • type_name_of_val
    • std::hash::{DefaultHasher, RandomState}
    • ptr::{from_ref, from_mut}
    • ptr::addr_eq
  • Реализован третий уровень поддержки для платформ {x86_64, i686}-win7-windows-msvc, aarch64-apple-watchos, arm64e-apple-ios и arm64e-apple-darwin. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.

Дополнительно можно отметить демонстрацию экспериментального планировщика задач scx_rustland, написанного на языке Rust и выполняемого в пространстве пользователя (вынос логики планирования задач из ядра в пространство пользователя реализовано при помощи инструментария sched-ext, использующего BPF). Планировщик оптимизирован для повышения приоритета интерактивных задач на фоне задач, интенсивно нагружающих CPU. Например, в тесте запуска игрового приложения одновременно со сборкой ядра планировщик scx_rustland позволил добиться в игре более высокого FPS, чем при использовании штатного планировщика EEVDF.



Источник: http://www.opennet.ru/opennews/art.shtml? num=60575

© OpenNet