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

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

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

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

  • Доданий режим конвеєрної компіляції (pipelined), коли він складання залежного crate-пакета починається відразу як стають доступні метадані залежності, не чекаючи завершення її компіляції. При компіляції пакета не потрібно, щоб залежності були зібрані повністю, достатньо лише визначення метаданих, що включають списки типів, залежностей та елементів, що експортуються. Метадані стають доступними на початковому етапі компіляції, тому пов'язані пакети тепер можна почати компілювати набагато раніше. При збиранні одиночних пакетів запропонований режим не позначається на продуктивності, але якщо збирання охоплює пакети з розгалуженими залежностями, загальний час збирання може скоротитися на 10-20%;
  • Забезпечено виявлення некоректного застосування функцій std::mem::uninitialized и std::mem::zeroed. Наприклад, std::mem::uninitialized зручний для швидкого створення масивів, але вводить компілятор в оману, оскільки створюють видимість виконання ініціалізації, а насправді значення залишається неініціалізованим. Функція mem::uninitialized вже позначена як застаріла та замість неї рекомендується використовувати проміжний тип MaybeUninit. Що стосується mem::zeroed, то ця функція може призводити до проблем з типами, які не можуть набувати нульових значень.

    Для виявлення невизначеної поведінки, що викликається, в новому випуску до компілятора додано lint-перевірка, що виявляє деякі проблеми c mem::uninitialized або mem::zeroed. Наприклад, тепер виводиться помилка при спробі використання mem::uninitialized або mem::zeroed з типами &T і Box‹T›, що представляють об'єкти-покажчики, які не можуть набувати нульових значень;

  • Розширено можливості застосування атрибуту «#[deprecated]», що дозволяє помітити crate-пакети застарілими та наміченими для видалення у майбутньому. Починаючи з версії Rust 1.38, цей атрибут також можна застосовувати для макросів;
  • Додано можливість застосування атрибуту «#[global_allocator]» у субмодулях;
  • Додана функція std::any::type_name, що дозволяє дізнатися ім'я типу, що може бути корисно з метою налагодження. Наприклад, у процесі виконання програми можна дізнатися для якого типу була викликана функція:

    fn gen_value‹T: Default>() -› T {
    println!(«Initializing an instance of {}», std::any::type_name::‹T›());
    Default::default()
    }

    fn main() {
    let _: i32 = gen_value(); # буде виведено «i32»
    let _: String = gen_value(); # буде виведено "alloc::string::String"
    }

  • Розширено функції стандартної бібліотеки:
    • slice::{concat, connect, join} тепер може набувати значення &[T] крім &T;
    • *const T і mut T тепер реалізують marker::Unpin;
    • «Arc‹[T]›» та «Rc‹[T]›» тепер реалізують FromIterator‹T›;
    • iter::{StepBy, Peekable, Take} тепер реалізують DoubleEndedIterator.
    • ascii::EscapeDefault реалізує Clone та Display.
  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано методи
    • ‹*const T›::cast, ‹*mut T›::cast,
    • Duration::as_secs_f{32|64},
    • Duration::div_duration_f{32|64},
    • Duration::div_f{32|64},
    • Duration::from_secs_f{32|64},
    • Duration::mul_f{32|64},
    • операції поділу із залишком
      div_euclid та rem_euclid для всіх цілих примітивів;

  • У пакетний менеджер cargo додано підтримку вказівки опції «-features» кілька разів для включення різних можливостей;
  • У компіляторі забезпечено третій рівень підтримки для цільових платформ aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-ms -gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl та riscv7i-unknown-none-elf. Третій рівень має на увазі базову підтримку, але без автоматизованого тестування та публікації офіційних збірок.

Джерело: opennet.ru

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