Реліз мови програмування Rust 2021 (1.56)

Опубліковано реліз мови системного програмування Rust 1.56, заснованого проектом Mozilla, але нині розвивається під заступництвом незалежної некомерційної організації Rust Foundation. Крім штатного номера версії, випуск також позначений як Rust 2021 і знаменує собою стабілізацію змін, запропонованих за останні три роки. Rust 2021 також виступить основою для нарощування функціональності в наступні три роки, за аналогією до того, як випуск Rust 2018 став базисом для розвитку мови в минулі три роки.

Для збереження сумісності розробники можуть використовувати у своїх програмах мітки «2015», «2018» та «2021», що дозволяють прив'язати програми до зрізів стану мови, які відповідають обраним редакціям Rust. Редакції були введені для розділення несумісних змін і налаштовуються метаданих cargo-пакетів через поле «edition» у секції «[package]». Наприклад, редакція «2018» включає стабілізовану на кінець 2018 року функціональність та також охоплює всі подальші зміни, які не порушують сумісність. Редакція «2021» додатково включає порушуючі сумісність нововведення, запропоновані у поточному випуску 1.56 та затверджені для реалізації у майбутньому. Окрім мови редакції також враховують стан інструментарію та документації.

Основні несумісності, зафіксовані в Rust 2021:

  • Роздільне захоплення у замиканнях - замикання тепер можуть захоплювати окремі імена полів замість всього ідентифікатора. Наприклад, «|| ax+1» захопить тільки «ax» замість «a».
  • Типаж IntoIterator для масивів: array.into_iter() дозволяє організувати перебір елементів масиву за значеннями, а не за посиланнями.
  • У macro_rules змінено обробку виразів «|» (логічна операція OR) у шаблонах - специфікатор ": pat" у зіставленнях тепер враховує шаблони "A | B».
  • У пакетному менеджері cargo включена за замовчуванням друга версія визначника доступних можливостей (feature resolver), підтримка якої з'явилася в Rust 1.51.
  • Типажі (trait) TryFrom, TryInto та FromIterator додані до складу модуля стандартної бібліотеки prelude.
  • Макроси panic!(..) та assert!(expr, ..) тепер завжди використовують format_args!(..) для форматування рядків за аналогією з println!().
  • У синтаксисі мови зарезервовані вирази ident#, ident»…» та ident'…'.
  • Попередження bare_trait_objects та ellipsis_inclusive_range_patterns переведені до категорії помилок.

Нововведення Rust 1.56:

  • У Cargo.toml в секції «[package]» додано поле rust-version, через яке можна визначити версію Rust, що мінімально підтримується, для crate-пакета. Якщо поточна версія не відповідає вказаному параметру, Cargo припинить роботу з виведенням помилки.
  • При порівнянні зі зразком за допомогою виразів "binding @ pattern" реалізована підтримка вказівки додаткових прив'язок (наприклад, "let matrix @ Matrix {row_len, ..} = get_matrix();").
  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано методи та реалізації типажів:
    • std::os::unix::fs::chroot
    • UnsafeCell::raw_get
    • BufWriter::into_parts
    • core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}
    • Vec::shrink_to
    • String::shrink_to
    • OsString::shrink_to
    • PathBuf::shrink_to
    • BinaryHeap::shrink_to
    • VecDeque::shrink_to
    • HashMap::shrink_to
    • HashSet::shrink_to
  • Ознака «const», що визначає можливість використання в будь-якому контексті замість констант, застосована у функціях
    • std::mem::transmute
    • [T]::first
    • [T]::split_first
    • [T]::last
    • [T]::split_last
  • Компілятор переведено використання версії LLVM 13.
  • Реалізовано другий рівень підтримки для платформи aarch64-apple-ios-sim та третій рівень для платформ powerpc-unknown-freebsd та riscv32imc-esp-espidf . Третій рівень передбачає базову підтримку, але без автоматизованого тестування, публікації офіційних збірок та перевірки можливості складання коду.

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

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

Джерело: opennet.ru

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