Вышел Rust 1.60

Стал доступен релиз Rust 1.60, который развивает некоммерческая организация Rust Foundation. Он предоставляет средства для достижения высокого параллелизма выполнения заданий без использования сборщика мусора и runtime.

9f415c9c086484fbf560f6cd8eccd17e.jpeg

В версию внедрили несколько новшеств:

  • в компиляторе rustc стабилизировали основанную на LLVM систему для генерации coverage-данных для оценки охвата кода при тестировании. Чтобы включить coverage-данные, нужно использовать флаг »-Cinstrument-coverage», например, запуская сборку командой «RUSTFLAGS=»-C instrument-coverage» cargo build». После запуска в текущем каталоге сохранится файл default.profraw, для обработки которого можно использовать утилиту llvm-profdata из компонента llvm-tools-preview. Обработанный утилитой llvm-profdata вывод можно передать программе llvm-cov для генерации аннотированного отчета со сведениями об охвате кода. Информация о привязке к исходным текстам извлекается из исследуемого исполняемого файла, в который включаются необходимые данные о связи coverage-счетчиков с кодом;

    1|      1|fn main() {

    2|      1|    println!("Hello, world!");

    3|      1|}

  • в пакетном менеджере cargo стабилизировали поддержку флага »--timings», включающего формирование детального отчета о ходе сборки и времени выполнения каждого шага. Он потребуется для оптимизации производительности сборочного процесса;

  • в пакетном менеджере cargo предложили новый синтаксис для механизма условной компиляции и выбора необязательных зависимостей в файле Cargo.toml через перечисление списка именованных свойств в секции [features] и активируемого через включение свойств во время сборки пакета при помощи флага »--features». Добавлена поддержка зависимостей в отдельных пространствах имен и слабых зависимостей. Реализована возможность использования внутри секции »[features]» элементов с префиксом «dep:» для явной привязки к необязательной зависимости без неявного представления этой зависимости как свойства (feature). Во втором случае добавлена поддержка пометки знаком »?» («package-name?/feature-name») необязательных зависимостей, которые следует включить, если какое-то другое свойство включает данную необязательную зависимость. Включение свойства serde приведёт к включению зависимости «serde», а также свойства «serde» для зависимости «rgb», но только если где-то ещё включена зависимость «rgb»;

   [dependencies]

   serde = { version = "1.0.133", optional = true }

   rgb = { version = "0.8.25", optional = true }

   [features]

   serde = ["dep:serde", "rgb?/serde"]

  • вернули ранее отключенную поддержку инкрементальной компиляции. Устранили соответствующую ошибку;

  • решили проблемы с предоставлением для таймеров Instant гарантии монотонного расчета времени, при котором учитывается время системы в спящем режиме. До этого для работы таймера по возможности использовался OS API, который не учитывал проблемные ситуации, нарушающие монотонность времени.

  • перевели в разряд стабильных новые API, в том числе стабилизированы методы и реализации типажей;

Arc::new_cyclic

Rc::new_cyclic

slice::EscapeAscii

<[u8]>::escape_ascii

u8::escape_ascii

Vec::spare_capacity_mut

MaybeUninit::assume_init_drop

MaybeUninit::assume_init_read

i8::abs_diff

i16::abs_diff

i32::abs_diff

i64::abs_diff

i128::abs_diff

isize::abs_diff

u8::abs_diff

u16::abs_diff

u32::abs_diff

u64::abs_diff

u128::abs_diff

usize::abs_diff

Display для io::ErrorKind

From для ExitCode

Not для ! (тип "never")

_Op_Assign<$t>

arch::is_aarch64_feature_detected!

  • реализовали третий уровень поддержки для платформ mips64-openwrt-linux-musl* и armv7-unknown-linux-uclibceabi (softfloat). Он подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода;

  • компилятор перевели на использование LLVM 14;

  • добавили поддержку раскрутки компилятора (bootstrapping) rustc при помощи бэкенда rustc_codegen_gcc, который позволяет использовать библиотеку libgccjit от проекта GCC в качестве генератора кода в rustc, чтобы обеспечить в rustc поддержку доступных в GCC архитектур и оптимизаций. Это позволяет собирать rust-программы для архитектур, ранее не поддерживаемых в rustc;

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

  • улучшены реализации многих утилит, улучшена совместимость утилит cp, dd, df, split и tr с аналогами от проекта GNU. Для разбора аргументов командной строки задействован парсер clap, что позволило улучшить вывод для флага »--help» и добавить поддержку аббревиатур длинных команд (можно указывать «ls --col» вместо «ls --color»).

24 февраля 2022 года вышел Rust 1.59.0. Он включал поддержку ассемблерных вставок и ассемблерных инструкций для архитектур x86, x86–64, ARM, AArch64 и RISC-V;
поддержку деструктурированных (параллельных) присвоений и т.д.

© Habrahabr.ru