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

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

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

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

  • Реалізовано підтримку типажів для масивів довільного розміру. Раніше через неможливість визначити generic-функції для всіх цілих значень стандартна бібліотека надавала вбудовану підтримку типажів тільки для масивів, розмір яких не перевищував 32 елементи (типажі для кожного розміру були визначені статично). Завдяки створенню функціональності константних дженериків (const generics) з'явилася можливість визначення generic-функцій для будь-яких розмірів масиву, але вони поки не включені до складу стабільних можливостей мови, хоча реалізовані в компіляторі і тепер задіяні у стандартній бібліотеці для типужів масивів будь-якого розміру.

    Наприклад, наступна конструкція в Rust 1.47 приведе до виведення вмісту масиву, хоча раніше призвела б до помилки:

    fn main() {
    let xs = [0; 34];

    println!(«{:?}», xs);
    }

  • Забезпечено виведення більш коротких трасування (backtrace), що виводяться при позаштатних ситуаціях. З трасування виключені елементи, що не становлять інтересу в більшості ситуацій, але захламляють висновок і відволікають від первинних причин проблеми. Для повернення повного трасування можна використовувати змінну оточення «RUST_BACKTRACE=full». Наприклад, для коду

    fn main() {
    panic! ();
    }

    раніше виводилося трасування в 23 етапи, а тепер воно буде зведено до
    3 етапам, що дозволяють відразу вловити суть:

    thread 'main' panicked at 'explicit panic', src/main.rs:2:5
    stack backtrace:
    0: std::panicking::begin_panic
    at /rustc/d…d75a/library/std/src/panicking.rs:497
    1: playground::main
    at./src/main.rs:2
    2: core::ops::function::FnOnce::call_once
    at /rustc/d…d75a/library/core/src/ops/function.rs:227

  • Компілятор rustc оновлено до збирання з використанням LLVM 11 (Rust використовує LLVM як бекенд для генерації коду). При цьому збережена можливість збирання зі старими LLVM, аж до версії 8, але за замовчуванням (у rust-lang/llvm-project) тепер використовується LLVM 11. Реліз LLVM 11 очікується найближчими днями.
  • На платформі Windows у компіляторі rustc забезпечено підтримку включення перевірок цілісності потоку виконання (Control Flow Guard), що активуються за допомогою прапора -C control-flow-guard. На інших платформах цей прапор поки що ігнорується.
  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано
    Ident::new_raw,
    Range::is_empty,
    RangeInclusive::is_empty,
    Result::as_deref,
    Result::as_deref_mut,
    Vec::leak,
    pointer::offset_from,
    f32::TAU та
    f64::TAU.

  • Ознака «const», що визначає можливість використання в будь-якому контексті замість констант, застосована у методах:
    • new для всіх, відмінних від нуля;
    • checked_add, checked_sub, checked_mul, checked_neg, checked_shl, checked_shr, saturating_add, saturating_sub та saturating_mul для всіх цілих;
    • is_ascii_alphabetic, is_ascii_uppercase, is_ascii_lowercase, is_ascii_alphanumeric, is_ascii_digit, is_ascii_hexdigit, is_ascii_punctuation, is_ascii_graphic, is_ascii_graphic, 8.
  • Для FreeBSD задіяний інструментарій із FreeBSD 11.4 (FreeBSD 10 не підтримує LLVM 11).

Джерело: opennet.ru

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