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

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

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

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

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

    Для додавання зовнішніх реєстрів у .cargo/config (розташованому в $HOME або директорії з пакетом)
    передбачена секція "[registries]", а для використання зовнішнього реєстру в описі кожної залежності в Cargo.toml з'явилася опція "registry". Для підключення до додаткового реєстру достатньо помістити токен аутентифікації у файл ~/.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) додано тип помилок Непогрішним, що дозволяє прозоро використовувати
    TryFrom для всіх існуючих реалізацій «From»;

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

  • Стабілізовано знакові та беззнакові атомарні цілочисельні типи розміром від 8 до 64 біт (наприклад, AtomicU8), а також знакові типи NonZeroI[8|16|32|64|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».

Джерело: opennet.ru

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