Выпуск Rust 1.79. Создан консорциум для разработки высоконадёжных систем на Rust

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

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

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

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

  • Добавлена поддержка inline-констант, которые можно указывать прямо в коде при помощи блоков «const { … }», обрабатываемых в контексте констант и позволяющих обойтись без отдельного определения констант. Указанный в блоке «const { … }» код вычисляется на этапе компиляции и используется как константа, без выполнения во время работы программы. В отличие от определения констант через выражение «const ITEM: … = …» в блоках «const { … }» можно не указывать тип, так как в них поддерживается автоматический вывод типов. Например, код с отдельным определением константы

    const EMPTY: Option<Vec<u8>> = None;
    let foo = [EMPTY; 100];

    можно заменить на использование по месту:

    let foo = [const { None }; 100];

  • Стабилизирован синтаксис «T: Trait<Assoc: Bounds…>» для задания ограничений в позиции ассоциативного типа, позволяющий сократить определение выражений с вложенными ограничениями типа, которые ранее требовали указания вложенного impl Trait или нескольких условий «where».
  • Обеспечено автоматическое продление времени жизни временных значений, которые используются в конструкциях «match» и «if».

    let a = if true {
    ..;
    &temp() // время жизни будет продлено
    } else {
    ..;
    &temp() // время жизни будет продлено
    };

  • Стабилизирована возможность импорта функции main из других модулей и crate-пакетов.
  • При сборке стандартной библиотеки в компиляторе задействован флаг «-Cforce-frame-pointers=yes», добавляющий данные для реконструкции стека во время профилирования программ.
  • В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
    • {integer}::unchecked_add
    • {integer}::unchecked_mul
    • {integer}::unchecked_sub
    • <[T]>::split_at_unchecked
    • <[T]>::split_at_mut_unchecked
    • <[u8]>::utf8_chunks
    • str::Utf8Chunks
    • str::Utf8Chunk
    • <*const T>::is_aligned
    • <*mut T>::is_aligned
    • NonNull::is_aligned
    • <*const [T]>::len
    • <*mut [T]>::len
    • <*const [T]>::is_empty
    • <*mut [T]>::is_empty
    • NonNull::<[T]>::is_empty
    • CStr::count_bytes
    • io::Error::downcast
    • num::NonZero<T>
    • path::absolute
    • proc_macro::Literal::byte_character
    • proc_macro::Literal::c_string
  • Признак «const», определяющий возможность использования в любом контексте вместо констант, применён в функциях:
    • Atomic*::into_inner
    • io::Cursor::new
    • io::Cursor::get_ref
    • io::Cursor::position
    • io::empty
    • io::repeat
    • io::sink
    • panic::Location::caller
    • panic::Location::file
    • panic::Location::line
    • panic::Location::column
  • Стабилизирована
    часть возможностей, которые можно использовать при компиляции в промежуточное представление Webassembly (WASM).

  • Реализован третий уровень поддержки для платформ aarch64-apple-visionos, aarch64-apple-visionos-sim и riscv32ima-unknown-none-elf. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.
  • Реализован второй уровень поддержки целевых платформ aarch64-pc-windows-gnullvm, i686-pc-windows-gnullvm и x86_64-pc-windows-gnullvm. Второй уровень поддержки подразумевает гарантию сборки.

Кроме того, организация Rust Foundation, которая курирует связанную с языком Rust экосистему, объявила о создании консорциума «Safety-Critical Rust Consortium», нацеленного на использовании языка Rust в решениях, требующих повышенной надёжности (Safety-Critical Software), сбой в которых может угрожать жизни людей, нанести вред окружающей среде или привести к серьёзным повреждениям оборудования. К консорциуму присоединились компании ARM, AdaCore, Ferrous Systems, OxidOS, Synopsys, HighTec EDV-Systeme GmbH, TrustInSoft, Veecle и Woven by Toyota. Среди задач, которые будет решать консорциум упоминается написание руководств и разработка библиотек, линтеров и статических анализаторов, а также применение методов формальной верификации надёжности и разработка подмножеств языка для высоконадёжных систем.

Из проектов, связанных с высоконадёжными системами, можно отметить Verus — инструментарий для проверки корректности кода, написанного на языке Rust. Проверка осуществляется путём определения спецификации, описывающей допустимое поведение кода. Во время выполнения исполняемого кода Verus проверяет соответствие спецификации для подтверждения корректности работы.

Источник: opennet.ru