+38/050/370-3627
+38/093/220-0872
+38/044/257-2444
Новини

Опубліковано реліз мови системного програмування Rust 1.36

Опубліковано реліз мови системного програмування Rust 1.36

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

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

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

  • Стабілізований типаж (trait) Future, який представляє значення, обчислення якого можливо ще не завершено в процесі використання блоків async/.await. Асинхронні значення, що визначаються за допомогою Future, дають можливість продовжити виконання в потоці корисної роботи, принагідно чекаючи завершення обчислень певного значення;
  • Стабілізовано бібліотеку alloc, яка надає розумні покажчики та колекції для керування розміщеними в пам'яті значеннями. Для виділення пам'яті в std тепер застосовується тип Vec, який реекспортуються з 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.

Інші новини