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

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

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

Автоматичне управління пам'яттю в Rust позбавляє розробника від маніпулювання покажчиками та захищає від проблем, що виникають через низькорівневу роботу з пам'яттю, таких як звернення до області пам'яті після її звільнення, розіменування нульових покажчиків, вихід за межі буфера і т.п. Для поширення бібліотек, забезпечення складання і управління залежностями проєкта розвивається пакетний менеджер Cargo, що дозволяє отримати потрібні для програми бібліотеки в один клік. Для розміщення бібліотек підтримується репозиторій 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, що представляють об'єкти-покажчики, які не можуть приймати нульові значення;
  • Розширено можливості застосування атрибута "# [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 ;
  • 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-msvc targets, armv7-unknown-linux-gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl і riscv32i-unknown-none-elf. Третій рівень передбачає базову підтримку, але без автоматизованого тестування і публікації офіційних збірок.

Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Війти / Зареєструватися