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

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

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

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

  • У пакетний менеджер Cargo додані кошти для роботи з альтернативними реєстрами пакетів, які можуть співіснувати з реєстром crates.io. Наприклад, розробники закритих додатків тепер можуть використовувати власний приватний реєстр, який можна використовувати при перерахунку залежностей у Cargo.toml, і застосовувати для своїх продуктів модель версіонування, схожу на crates.io, а також посилатися в залежностях як на crates.io, так і на власний реєстр.

    Для додавання зовнішнього реєстру ~/.cargo/config
    у секції "[registries]" передбачена нова опція "my-registry", а для згадування зовнішнього реєстру в залежностях у Cargo.toml у секції "[dependencies]" з'явилася опція "other-crate". Для підключення до додаткового реєстру достатньо помістити токен аутентифікації у файл ~/.cargo/credentials та виконати команду
    "cargo login -registry=my-registry", а для публікації пакета -
    "cargo publish -registry = my-registry";

  • Додано повноцінну підтримку використання оператора «?» у тестах doctests, що дозволяють використовувати код прикладів з документації як тести. Раніше оператор
    "?" можна було використовувати для обробки помилок у процесі виконання тестів тільки за наявності функції fn main() або в функціях #[test];

  • У визначених за допомогою процедурних макросів власних атрибутах (custom attribute) забезпечено можливість використання довільних наборів токенів («#[attr($tokens)]», «#[attr[$tokens]] і #[attr{$tokens}]») . Раніше елементи могли задаватися тільки в деревоподібному/рекурсивному вигляді з використанням рядкових літералів, наприклад "#[foo(bar, baz(quux, foo = "bar"))]]", а тепер можливе використання перерахувань ('#[range(0). .10)]') та конструкцій виду «#[bound(T: MyTrait)]»;
  • Стабілізовані типажі (trait) TryFrom та TryInto, що дозволяють виконувати перетворення типів з обробкою помилок. Наприклад, методи, подібні from_be_bytes, з цілими типами як вхідні дані використовують масиви, але дані часто надходять з типом Slice, а перетворення між масивами і слайсами проблематично робити вручну. За допомогою нових типажів зазначена операція може бути здійснена на льоту через виклик .try_into(), наприклад, «let num = u32::from_be_bytes(slice.try_into()?)». Для перетворень, які завжди завершуються успішно (наприклад, з типу u8 до u32) доданий тип помилок Infallible, що дозволяє прозоро використовувати
    TryFrom для всіх існуючих реалізацій «From»;

  • Оголошена застаріла функція CommandExt::before_exec, що дозволяла виконати обробник перед запуском exec, який виконувався в контексті дочірнього процесу, відгалуженого після виклику fork(). У подібних умовах деякі ресурси батьківського процесу, такі як файлові дескриптори та відображені області пам'яті, могли бути дубльовані, що могло призвести до невизначеної поведінки та неправильної роботи бібліотек.
    Замість before_exec рекомендується використовувати unsafe-функцію CommandExt::pre_exec.

  • Стабілізовано знакові та беззнакові атомарні цілочисленні типи розміром від 8 до 64 біт (наприклад, AtomicU8), а також знакові типи NonZeroI[8|16|32|54|128].
  • У розряд стабільних переведена нова порція API, у тому числі стабілізовані методи Any::type_id, Error::type_id, slice::sort_by_cached_key, str::escape_*, str::split_ascii_whitespace, Instant::checked_[add|sub] та SystemTime ::checked_[add|sub]. Стабілізовані функції iter:: from_fn та iter:: successors;
  • Для всіх цілих типів реалізовані методи checked_pow, saturating_pow, wrapping_pow і overflowing_pow;
  • Додана можливість включення оптимізації на етапі зв'язування через вказівку складальної опції "-C linker-plugin-lto" (rustc компілює код Rust в біткод LLVM, що дозволяє застосувати LTO-оптимізації).

Джерело: opennet.ru

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