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

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

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

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

  • Стабілізовано використання макросу panic! у контекстах, що створюються під час компіляції, таких як оголошення «const fn». Крім того, крім використання "panic!" у const-оголошеннях дозволено використання макросу «assert!» та деяких інших API стандартної бібліотеки. Стабілізація поки що не охоплює всю інфраструктуру форматування, тому в поточному вигляді макрос panic! може використовуватися тільки зі статичними рядками (panic!(«…»)) або з одним інтерполірованим значенням «&str» при підстановці (panic!(«{}», a)), яке повинно обмежуватися підстановкою «{}» без специфікаторів форматування та інших типажів. У майбутньому застосування макросів у константних контекстах буде розширено, але стабілізованих можливостей вже достатньо для виконання assert-перевірок на етапі компіляції: const _: () = assert!(std::mem::size_of:: () == 64); const _: () = assert!(std::mem::size_of:: () == 8);
  • У пакетному менеджері Cargo дозволено використання профілів з довільними іменами, не обмеженими "dev", "release", "test" та "bench". Наприклад, для включення оптимізації на етапі зв'язування (LTO) тільки при формуванні фінальних складання продукту можна в Cargo.toml створити профіль «production» і додати до нього прапор «lto = true». При цьому при визначенні власних профілів обов'язково потрібно вказати існуючий профіль для наслідування з нього стандартних налаштувань. У прикладі нижче створюється профіль production, який доповнює профіль release включенням прапора lto = true. Сам профіль активується при виклику cargo з опцією «profile production», а складальні артефакти будуть розміщені в каталозі «target/production». [profile.production] inherits = "release" lto = true
  • Стабілізовано використання try_reserve для типів Vec, String, HashMap, HashSet та VecDeque, що дозволяє заздалегідь резервувати місце для певної кількості елементів заданого типу для того, щоб знизити частоту виконання операцій виділення пам'яті та уникнути аварійного завершення в процесі роботи через брак пам'яті.
  • Дозволено вказівку макросів з фігурними дужками у виразах подібних «m!{..}.method()» і «m!{..}?».
  • Оптимізовано виконання функцій File::read_to_end та read_to_string.
  • Підтримку специфікації Unicode оновлено до версії 14.0.
  • Розширено число функцій, помічених «#[must_use]» для виведення попередження у разі ігнорування значення, що повертається, що допомагає виявити помилки, викликані припущенням, що функція змінить значення, а не поверне нове значення.
  • Доданий експериментальний бекенд для генерації коду з використанням libgccjit.
  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано методи та реалізації типажів:
    • [T; N]::as_mut_slice
    • [T; N]::as_slice
    • collections::TryReserveError
    • HashMap::try_reserve
    • HashSet::try_reserve
    • String::try_reserve
    • String::try_reserve_exact
    • Vec::try_reserve
    • Vec::try_reserve_exact
    • VecDeque::try_reserve
    • VecDeque::try_reserve_exact
    • Iterator::map_while
    • iter::MapWhile
    • proc_macro::is_available
    • Command::get_program
    • Command::get_args
    • Command::get_envs
    • Command::get_current_dir
    • CommandArgs
    • CommandEnvs
  • Ознака «const», що визначає можливість використання у будь-якому контексті замість констант, застосований до функцій hint::unreachable_unchecked.
  • Реалізовано третій рівень підтримки для платформ armv6k-nintendo-3ds, armv7-unknown-linux-uclibceabihf, m68k-unknown-linux-gnu, aarch64-kmc-solid_asp3, armv7a-kmc-solid_asp3-eabi Третій рівень передбачає базову підтримку, але без автоматизованого тестування, публікації офіційних збірок та перевірки можливості складання коду.

Джерело: opennet.ru

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