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

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

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

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

  • Додано можливість позначення структур (struct) та перерахувань (enum c блоком Variant) за допомогою атрибуту «#[non_exhaustive]", Котрий дозволяє надалі додавати нові поля та варіанти в оголошені структури та перерахування. Наприклад, розробники модулів, які мають структури з публічно оголошеними полями, можуть використовувати «#[non_exhaustive]» для позначення структур, у яких у майбутньому можливе додавання нових полів. Досі в подібній ситуації розробник змушений був обирати між приватним оголошенням полів та прив'язкою до незмінного списку полів. Новий атрибут знімає це обмеження та дозволяє в майбутньому додавати нові поля без ризику порушення роботи раніше зібраного зовнішнього коду. У crate-пакетах при зіставленні варіантів у секції «match» потрібно явне визначення маски «_ => {…}», що охоплює можливі майбутні поля, інакше при додаванні нових полів буде виводитися помилка.
  • Додана можливість викликати процедурний макрос mac!() у контексті типу. Наприклад, тепер можна писати "type Foo = expand_to_type!(bar);", якщо "expand_to_type" процедурний макрос.
  • У блоках "extern {...}" додано можливість використання процедурних та атрибутних макросів, у тому числі макросів «bang!()», наприклад:

    macro_rules! make_item { ($name:ident) => { fn $name(); } }

    extern {
    make_item!(alpha);
    make_item!(beta);
    }

    extern «C» {
    #[my_identity_macro] fn foo();
    }

  • У макросах реалізована можливість створення елементів «macro_rules!». Генерація "macro_rules!" можлива як і нагадують функції макросах («mac!()»), і у макросах у вигляді атрибутів («#[mac]»).
  • В елементі зіставлення $m:meta додано підтримка довільних значень перерахувань токенів («[TOKEN_STREAM]», «{TOKEN_STREAM}» та «(TOKEN_STREAM)), наприклад:

    macro_rules! accept_meta { ($m:meta) => {} }
    accept_meta!(my:: path);
    accept_meta! (my:: path = "lit");
    accept_meta! (my:: path (abc));
    accept_meta! (my:: path [abc]);
    accept_meta! (my:: path {abc});

  • У режимі Rust 2015 активовано виведення помилки для проблем, виявлених під час перевірки запозичення змінних (borrow checker) з використанням техніки NLL (Non-Lexical Lifetimes). Раніше попередження були замінені на помилки під час роботи в режимі Rust 2018.
    Після поширення зміни та на режим Rust 2015 розробники отримали можливість остаточно позбутися від старого borrow checker.

    Нагадаємо, що система перевірки на основі нового механізму обліку часу життя запозичених змінних дала можливість виявляти деякі проблеми, які залишалися непоміченими старим кодом перевірки. Так як висновок помилки для подібних перевірок міг вплинути на сумісність з раніше працюючим кодом, замість помилок спочатку видавалися попередження.

  • Ознака «const», визначальний можливість використання у будь-якому контексті замість констант, застосований функції is_power_of_two (для беззнакових цілих чисел).
  • У розряд стабільних переведена нова порція API, у тому числі стабілізовані макрос todo!() і методи slice::repeat, mem::take, BTreeMap::get_key_value, HashMap::get_key_value,
    Option::as_deref, Option::as_deref_mut, Option::flatten, UdpSocket::peer_addr, {f32,f64}::to_be_bytes, {f32,f64}::to_le_bytes,{f32,f64}::to_ne_bytes, { f32}::from_be_bytes, {f64,f32}::from_le_bytes, and {f64,f32}::from_ne_bytes.

  • У пакетному менеджері cargo
    реалізовано кешування на диску попередження компілятора. До команди «cargo metadata» додано опцію «-filter-platform» для показу у графі дозволу залежностей лише пакетів, прив'язаних до зазначеної цільової платформи. Додано параметр конфігурації http.ssl-version для визначення допустимих версій TLS.
    Додано можливість публікації секції «dev-dependenciesбез вказівки ключа «version».

  • У компіляторі rustc забезпечений третій рівень підтримки цільових платформ thumbv7neon-unknown-linux-musleabihf, aarch64-unknown-none-softfloat, mips64-unknown-linux-muslabi64 та mips64el-unknownbilin Третій рівень має на увазі базову підтримку, але без автоматизованого тестування та публікації офіційних збірок.

Джерело: opennet.ru

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