+38/050/370-3627
+38/093/220-0872
+38/044/257-2444
Новини

Rust 1.38 - опубліковано реліз мови системного програмування, заснованого проектом Mozilla

Rust 1.38 - опубліковано реліз мови системного програмування, заснованого проектом Mozilla

Опубліковано реліз мови системного програмування 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-перевірку, що виявляє деякі проблеми з mem::uninitialized або mem::zeroed. Наприклад, тепер виводиться помилка під час спроби використання mem::uninitialized або mem::zeroed з типами &T та Box‹T›, що представляють об'єкти-покажчики, які не можуть набувати нульових значень;

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

Інші новини