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

Реліз мови системного програмування Rust 1.34, що розвивається проектом Mozilla

Реліз мови системного програмування Rust 1.34, що розвивається проектом Mozilla

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

Автоматичне управління пам'яттю в Rust позбавляє розробника від маніпулювання покажчиками та захищає від проблем, що виникають через низькорівневу роботу з пам'яттю, таких як звернення до області пам'яті після її звільнення, розіменування нульових покажчиків, вихід за межі буфера тощо. Для поширення бібліотек, забезпечення складання та управління залежностями проектом розвивається пакетний менеджер Cargo, що дозволяє отримати потрібні для програми бібліотеки за один клік. Для розміщення бібліотек підтримується репозиторій 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) додано тип помилок Infallible, що дозволяє прозоро використовувати 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".

Інші новини

Найкраща ціна