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

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

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

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

  • Стабілізований типаж (trait) Future, який представляє значення, обчислення якого ще не завершено в процесі використання блоків async / .await. Асинхронні значення, що визначаються за допомогою Future, дають можливість продовжити виконання в потоці корисної роботи, попутно очікуючи завершення обчислень певного значення;
  • Стабілізована бібліотека розподілити, що надає розумні покажчики і колекції для керування значеннями, що розміщуються в пам'яті. Для виділення пам'яті в std тепер застосовується тип Річ, котрий реекспортуються з alloc. Окреме використання alloc має сенс у додатках не прив'язаних до std («#![no_std]»), а також у бібліотеках, розрахованих на застосування у подібних програмах без std;
  • Для обходу перевірок коректної ініціалізації значень запропонований проміжний тип MaybeUninit, який можна використовувати замість функції mem::uninitialized, як її більш безпечної альтернативи. Функція mem::uninitialized зручна для швидкого створення масивів, але вводить компілятор в оману, оскільки створює видимість виконання ініціалізації, але насправді значення залишається неініціалізованим. MaybeUninit дозволяє явно вказати компілятору, що значення неініціалізоване, врахувати пов'язану з цим можливу невизначену поведінку, а також у програмах організувати перевірку через «maybe_t:» та поетапну ініціалізацію з позначкою її завершення за допомогою виклику «.assume_init()». З появою MaybeUninit функцію mem::uninitialized переведено в розряд застарілих і не рекомендовано до використання;
  • Техніка NLL (Non-Lexical Lifetimes), що розширила систему обліку часу життя запозичених змінних, стабілізована для мови Rust 2015 (спочатку NLL підтримувався тільки Rust 2018). Замість прив'язки часу життя на лексичному рівні, NLL здійснює облік лише на рівні набору покажчиків у графі потоку виконання. Подібний підхід дозволяє збільшити якість перевірки запозичення змінних (borrow checker) та допустити виконання деяких видів коректного коду, використання якого раніше призводило до виведення помилки. Нова поведінка також значно спрощує налагодження;
  • Включено нову реалізацію асоціативних масивів HashMap, заснована на застосуванні структури Swiss Table (автоматично завантажується hashbrown::HashMapякщо явно не вказано інше, наприклад, std::HashMap, який заснований на SipHash 1-3). Програмний інтерфейс залишився тим самим, а помітні розробнику відмінності зводяться до збільшення продуктивності та зниження споживання пам'яті;
  • У пакетний менеджер cargo додано опція «offline», що включає режим роботи без звернення по мережі, при якому при встановленні залежностей використовуються тільки прокешовані в локальній системі пакети. Якщо залежність відсутня у локальному кеші, то буде виведено помилку. Для попереднього завантаження залежностей у локальний кеш перед переходом у offline можна використовувати команду cargo fetch;
  • Реалізовано можливість виклику макросу «dbg!» із зазначенням кількох аргументів;
  • Ознака «const», що визначає можливість використання в будь-якому контексті замість констант, застосована для методів
    Layout::from_size_align_unchecked,
    mem::needs_drop,
    NonNull::dangling та
    NonNull::cast;

  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано методи
    task::Waker, task::Poll,
    VecDeque::rotate_left, VecDeque::rotate_right,
    Read::read_vectored, Write::write_vectored,
    Iterator::copied,
    BorrowMut (для рядків) та str::as_mut_ptr.

Джерело: opennet.ru

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