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

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

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

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

  • Усунено давню недоробка при виконанні перетворень між цілими числами та числами з плаваючою комою. Так як компілятор Rust використовує LLVM як бекенд, операції перетворення типів виконували через інструкції проміжного коду LLVM, такі як fptoui, У яких є одна істотна особливість - невизначена поведінка, якщо результуюче значення не вміщується в цільовий тип. Наприклад, при перетворенні речового значення 300 з типом f32 цілий тип u8 результат непередбачуваний і може відрізнятися на різних системах. Проблема в тому, що подібна особливість проявляється в коді, що не позначений як «unsafe».

    Починаючи з Rust 1.45, поведінка при переповненні розміру типу жорстко регламентована, а операція перетворення «as» виконує перевірку на переповнення і наводить перетворюване значення до максимального або мінімального значення цільового типу (для вищезазначеного прикладу значення 300 буде перетворено на 255). Для вимкнення подібних перевірок передбачені додаткові виклики API "{f64, f32}::to_int_unchecked", що працюють у режимі unsafe.

    fn cast(x: f32) -> u8 {
    x as u8
    }

    fn main() {
    let too_big = 300.0;
    let too_small = -100.0;
    let nan = f32:: NAN;

    let x: f32 = 1.0;
    let y: u8 = unsafe { x.to_int_unchecked() };

    println!(«too_big_casted = {}», cast(too_big)); // на виході 255
    println!(«too_small_casted = {}», cast(too_small)); // на виході 0
    println!("not_a_number_casted = {}", cast(nan)); // на виході 0
    }

  • Стабілізовано використання процедурних макросів, схожих на функції, у виразах, шаблонах та твердженнях. Раніше подібні макроси могли викликатися не скрізь, а лише у певних частинах коду (окремим викликом, що не переплітається з іншим кодом). Розширення способів виклику макросів, схожих на функції, було одним з потрібних для забезпечення роботи web-фреймворку Ракета у стабільних випусках Rust. Раніше для досягнення додаткової гнучкості завдання обробників у Rocket вимагалося включення експериментальної можливості proc_macro_hygiene, недоступної в стабільних версіях Rust. Тепер вказана функціональність убудована у стабільні випуски мови.
  • Дозволено використання діапазонів із типом «char» для перебору значень діапазону (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    for ch in 'a'..='z' {
    print! («{}», ch);
    }
    println!(); // Буде виведено «abcdefghijklmnopqrstuvwxyz»

  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано
    Arc::as_ptr,
    BTreeMap::remove_entry,
    Rc::as_ptr,
    rc::Weak::as_ptr,
    rc::Weak::from_raw,
    rc::Weak::into_raw,
    str::strip_prefix,
    str::strip_suffix,
    sync::Weak::as_ptr,
    sync::Weak::from_raw,
    sync::Weak::into_raw,
    char::UNICODE_VERSION,
    Span::resolved_at,
    Span::located_at,
    Span::mixed_site,
    unix::process::CommandExt::arg0.

  • У компілятор rustc додано підтримку перевизначення різних можливостей цільової платформи за допомогою прапора "target-feature", наприклад, "-C target-feature=+avx2,+fma". Також додані нові прапори:
    "force-unwind-tables" для генерації "розкручених" (unwind) таблиць викликів, незалежно від стратегії обробки краху; «embed-bitcode» для керування включенням біткоду LLVM у генеровані rlibs. Прапор embed-bitcode за замовчуванням задіяний в Cargo для оптимізації часу складання та споживання дискового простору.

  • Забезпечено третій рівень підтримки для платформ mipsel-sony-psp та thumbv7a-uwp-windows-msvc. Третій рівень має на увазі базову підтримку, але без автоматизованого тестування та публікації офіційних збірок.

Додатково можна відзначити розповідь про створення найпростішого додатки мовою Rust, що стартує за допомогою системного завантажувача та готового до самодостатнього завантаження замість операційної системи.
Стаття є першою у серії, присвяченій демонстрацією прийомів, затребуваних при низькорівневому програмуванні та розробці ОС.

Джерело: opennet.ru

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