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

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

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

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

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

  • У переліках з цілими уявленнями (атрибутом «#[repr(Int)]») дозволено явну вказівку дискримінанта (номери варіанта в перерахуванні), навіть якщо перелік містить поля. #[repr(u8)] enum Foo { A(u8), # дискримінант 0 B(i8), # дискримінант 1 C(bool) = 42, # дискримінант 42}
  • Додано функцію core::hint::black_box, яка просто повертає назад прийняте значення. Так як компілятор вважає, що дана функція виконує певну дію, функцію black_box можна використовувати для відключення оптимізації компілятором циклів при проведенні тестування продуктивності коду або при вивченні машинного коду, що генерується (щоб компілятор не вважав код невикористовуваним і не прибрав його). Наприклад, у прикладі нижче вказівка ​​black_box(v.as_ptr()) не дозволяє компілятору вважати, що вектор не використовується. use std::hint::black_box; fn push_cap(v: &mut Vec) { for i in 0..4 { v.push(i); black_box(v.as_ptr()); } }
  • У пакетному менеджері "cargo" запропонована команда "remove", що дозволяє з командного рядка видаляти залежності з маніфесту Cargo.toml.
  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано методи та реалізації типажів:
    • proc_macro::Span::source_text
    • u*::{checked_add_signed, overflowing_add_signed, saturating_add_signed, wrapping_add_signed}
    • i*::{checked_add_unsigned, overflowing_add_unsigned, saturating_add_unsigned, wrapping_add_unsigned}
    • i*::{checked_sub_unsigned, overflowing_sub_unsigned, saturating_sub_unsigned, wrapping_sub_unsigned}
    • BTreeSet::{first, last, pop_first, pop_last}
    • BTreeMap::{first_key_value, last_key_value, first_entry, last_entry, pop_first, pop_last}
    • Реалізації Add AsFd для типів stdio блокувань при застосуванні WASI.
    • impl TryFrom > для Box<[T; N]>
    • core::hint::black_box
    • Duration::try_from_secs_{f32,f64}
    • Option::unzip
    • std::os::fd
  • У шаблонах можна використовувати діапазони «..X» та «..=X».
  • При складанні фронтенду компілятора rustc і бекенда LLVM задіяні режими оптимізації LTO (Link Time Optimization) та BOLT (Binary Optimization and Layout Tool), що дозволяють збільшити продуктивність результуючого коду та знизити споживання пам'яті.
  • Реалізовано третій рівень підтримки для платформ armv5te-none-eabi та thumbv5te-none-eabi. Третій рівень передбачає базову підтримку, але без автоматизованого тестування, публікації офіційних збірок та перевірки можливості складання коду.
  • Додано підтримку зв'язування з універсальними бібліотеками macOS.

Додатково можна відзначити включення до кодової бази GCC фронтенду компілятора Rust (gccrs). Фронтенд включений у гілку GCC 13, реліз якої відбудеться у травні 2023 року. Починаючи з GCC 13 штатний інструментарій GCC зможе використовуватися для компіляції програм мовою Rust без необхідності встановлення компілятора rustc, побудованого з використанням напрацювань LLVM. Реалізація Rust у GCC 13 матиме статус бета-версії, яка не включається за умовчанням.

Джерело: opennet.ru

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