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

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

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

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

  • Стабілізовано новий синтаксис асинхронного програмування, заснований на функції "async", блоці async move {...} і операторі ".await", які спрощують написання обробників, які не блокують основний потік команд. У порівнянні з раніше пропонованим API для асинхронного введення/виведення конструкції async/.await прості для сприйняття, добре читаються і дозволяють реалізовувати складні асинхронні взаємодії з використанням звичних прийомів керування потоком виконання на основі циклів, умовних операторів та винятків.

    Синтаксис Async-await дозволяє створювати функції, які можуть призупиняти виконання, повертати управління в основний потік, а потім відновлювати виконання з того місця, де вони були зупинені. Наприклад, подібне призупинення затребуване при обробці вводу/виводу, в якому під час очікування надходження чергової порції даних можна виконувати іншу роботу. Функції та блоки, визначені через «async fn» та «async move», повертають типаж Future, Що визначає подання відкладеного на майбутнє асинхронного обчислення Безпосередньо ініціювати відкладене обчислення та отримати результат можна за допомогою оператора ".await". До виклику «.await» жодних дій не виконується і не планується заздалегідь, що дозволяє створювати складні вкладені конструкції без додаткових витрат.

    async fn first_function() -> u32 {..}
    ...
    let future = first_function();
    ...
    let result: u32 = future.await;

  • Стабілізовано «#![feature(bind_by_move_pattern_guards)]», що дозволяє використовувати змінні з типом прив'язки «by-move» у шаблонах та використовувати посилання на ці змінні в секції «if» вирази «матч“. Наприклад, тепер допустимі такі конструкції:

    fn main() {
    let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]);

    match array {
    чисел
    if nums.iter().sum::() == 10

    => {
    drop(nums);
    }
    _ => unreachable!(),
    }
    }

  • Дозволено вказівку атрибутів визначення параметрів функцій, замикань і вказівників на функції. Підтримуються атрибути умовної компіляції (cfg, cfg_attr), що керують діагностикою через lint (allow, warn, deny та forbid) та допоміжні атрибути виклику макросів.

    fn len(
    #[cfg(windows)] slice: &[u16], // використовувати параметр у Windows
    #[cfg(not(windows))] slice: &[u8], // використовувати інших ОС
    ) -> usize {
    slice.len()
    }

  • Попередження про проблеми, виявлені під час перевірки запозичення змінних (borrow checker) з використанням техніки NLL (Non-Lexical Lifetimes), перекладені у розряд фатальних помилок. Нагадаємо, що система перевірки на основі нового механізму обліку часу життя запозичених змінних дала можливість виявляти деякі проблеми, які залишалися непоміченими старим кодом перевірки. Так як висновок помилки для подібних перевірок міг вплинути на сумісність з раніше працюючим кодом, замість помилок спочатку видавалися попередження. Тепер під час роботи в режимі Rust 2018 попередження замінено на помилки. У наступному випуску виведення помилки також буде реалізовано в режимі Rust 2015, що дозволить остаточно позбавитися старого borrow checker;
  • Ознака «const», яка визначає можливість використання в будь-якому контексті замість констант, застосована для функцій Vec::new, String::new, LinkedList::new, str::len, [T]::len, str::as_bytes,
    abs, wrapping_abs та overflowing_abs;

  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано методи
    Pin::into_inner, Instant::checked_duration_since та Instant::saturating_duration_since;

  • У пакетний менеджер cargo додано можливість використання файлів конфігурації розширення «.toml». Додано попередню підтримку складання стандартної бібліотеки безпосередньо з Cargo. Доданий прапор «—workspace», який замінив прапор «—all», що неоднозначно сприймається. У метадані додано нове поле «публікувати«, що дозволяє публікувати залежності, вказуючи тег у git та номер версії. Додано тестову опцію «-Ztimings» для генерації HTML-звіту про час виконання різних стадій компіляції.
  • У компіляторі rustc у діагностичних повідомленнях включено обрізання хвостів коду, що не вміщується в термінал. Забезпечено третій рівень підтримки цільових платформ
    i686-unknown-uefi та sparc64-unknown-openbsd. Третій рівень має на увазі базову підтримку, але без автоматизованого тестування та публікації офіційних збірок.

Джерело: opennet.ru

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