Випуск мови програмування Rust 1.60

Опубліковано реліз мови програмування загального призначення Rust 1.60, заснованого проектом Mozilla, але нині розвивається під заступництвом незалежної некомерційної організації Rust Foundation. Мова сфокусована на безпечній роботі з пам'яттю та надає засоби для досягнення високого паралелізму виконання завдань, при цьому обходячись без використання збирача сміття та runtime (runtime зводиться до базової ініціалізації та супроводу стандартної бібліотеки).

Методи роботи з пам'яттю в Rust позбавляють розробника помилок при маніпулюванні покажчиками і захищають від проблем, що виникають через низькорівневу роботу з пам'яттю, таких як звернення до області пам'яті після її звільнення, розіменування нульових покажчиків, вихід за межі буфера і т.п. Для поширення бібліотек, забезпечення збирання та управління залежностями проектом розвивається пакетний менеджер Cargo. Для розміщення бібліотеки підтримується репозиторій crates.io.

Безпечна робота з пам'яттю забезпечується в Rust під час компіляції через перевірку посилань, відстеження володіння об'єктами, облік часу життя об'єктів (області видимості) та оцінку коректності доступу до пам'яті під час виконання коду. Rust також надає засоби для захисту від цілих переповнень, вимагає обов'язкової ініціалізації значень змінних перед використанням, краще обробляє помилки в стандартній бібліотеці, застосовує концепцію незмінності посилань і змінних за умовчанням, пропонує сильну статичну типізацію для мінімізації логічних помилок.

Основні нововведення:

  • У компіляторі 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
    • Від ExitCode
    • Ні для ! (Тип "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 архітектур і оптимізації. Під розкручуванням компілятора розуміється можливість використання в rustc генератора коду на основі GCC для збирання самого компілятора rustc. З практичного боку подібна можливість дозволяє збирати rust-програми для архітектур, які раніше не підтримувалися в rustc.
  • Доступний випуск інструментарію uutils coreutils 0.0.13, у рамках якого розвивається аналог пакету GNU Coreutils, переписаний мовою Rust. До складу coreutils входить більше ста утиліт, включаючи 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. Надано online-документацію. Для аналізу аргументів командного рядка задіяний парсер clap, що дозволило поліпшити висновок для прапора «-help» і додати підтримку абревіатур довгих команд (наприклад, можна вказувати «ls-col» замість «ls-color»).

Джерело: opennet.ru

Додати коментар або відгук