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

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

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

Безпечна робота з пам'яттю забезпечується в Rust під час компіляції через перевірку посилань, відстеження володіння об'єктами, облік часу життя об'єктів (області видимості) та оцінку коректності доступу до пам'яті під час виконання коду. Rust також надає засоби для захисту від цілих переповнень, вимагає обов'язкової ініціалізації значень змінних перед використанням, краще обробляє помилки в стандартній бібліотеці, застосовує концепцію незмінності посилань і змінних за умовчанням, пропонує сильну статичну типізацію для мінімізації логічних помилок.

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

  • Підвищено вимоги до оточення Linux у компіляторі, пакетному менеджері Cargo та стандартній бібліотеці libstd — мінімальні вимоги до Glibc піднято з версії 2.11 до 2.17, а ядра Linux з версії 2.6.32 до 3.2. Обмеження також поширюються на виконувані файли Rust-програм, зібраних з libstd. Новим вимогам відповідають дистрибутиви RHEL 7, SLES 12-SP5, Debian 8 та Ubuntu 14.04. Буде припинено підтримку RHEL 6, SLES 11-SP4, Debian 7 та Ubuntu 12.04. Користувачам, які використовують зібрані інструментарієм Rust файли, що виконуються в оточеннях зі старим ядром Linux, запропоновано оновити свої системи, залишатися на старих випусках компілятора або самостійно підтримувати своє відгалуження libstd з прошарками для збереження сумісності.

    Серед причин припинення підтримки старих Linux-систем згадуються обмежені ресурси щодо продовження супроводу сумісності зі старими оточеннями. Підтримка старих Glibc вимагає використання старого інструментарію під час перевірки в системі безперервної інтеграції, в умовах підвищення вимог до версій у LLVM та утилітах крос-компіляції. Підвищення вимог до версії ядра пов'язане з можливістю використання в libstd нових системних викликів без підтримки прошарків для забезпечення сумісності зі старими ядрами.

  • Стабілізований типаж IntoFuture, що нагадує IntoIterator, але відрізняється від останнього використанням ".await" замість циклів "for...in...". У поєднанні з IntoFuture ключове слово ".await" може очікувати не тільки типу Future, але і будь-які інші типи, які можна конвертувати в Future.
  • Утиліта rust-analyzer включена до складу колекції утиліт, що поставляється у випусках Rust. Утиліта також доступу для встановлення за допомогою rustup (rustup component add rust-analyzer).
  • У пакетному менеджері Cargo реалізовано можливість успадкування робочої області для виключення дублювання між пакетами типових значень полів, таких як версії Rust та URL репозиторіїв. Також додано підтримку складання відразу для кількох цільових платформ (в опції «target» тепер можна вказувати більше одного параметра).
  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано методи та реалізації типажів:
    • future::IntoFuture
    • num::NonZero*::checked_mul
    • num::NonZero*::checked_pow
    • num::NonZero*::saturating_mul
    • num::NonZero*::saturating_pow
    • num::NonZeroI*::abs
    • num::NonZeroI*::checked_abs
    • num::NonZeroI*::overflowing_abs
    • num::NonZeroI*::saturating_abs
    • num::NonZeroI*::unsigned_abs
    • num::NonZeroI*::wrapping_abs
    • num::NonZeroU*::checked_add
    • num::NonZeroU*::checked_next_power_of_two
    • num::NonZeroU*::saturating_add
    • os::unix::process::CommandExt::process_group
    • os::windows::fs::FileTypeExt::is_symlink_dir
    • os::windows::fs::FileTypeExt::is_symlink_file
  • До основного складу (core) та бібліотеки alloc додані Сі-сумісні типи, раніше стабілізовані в модулі std::ffi:
    • core::ffi::CStr
    • core::ffi::FromBytesWithNulError
    • alloc::ffi::CString
    • alloc::ffi::FromVecWithNulError
    • alloc::ffi::IntoStringError
    • alloc::ffi::NulError
  • У модулі core::ffi та std::ffi додані Сі-типи, раніше стабілізовані в модулі std::os::raw (наприклад, для Сі-типів uint та ulong запропоновані типи c_uint та c_ulong):
    • ffi::c_char
    • ffi::c_double
    • ffi::c_float
    • ffi::c_int
    • ffi::c_long
    • ffi::c_longlong
    • ffi::c_schar
    • ffi::c_short
    • ffi::c_uchar
    • ffi::c_uint
    • ffi::c_ulong
    • ffi::c_ulonglong
    • ffi::c_ushort
  • Стабілізовані низькорівневі обробники для використання з механізмом Poll (у майбутньому планується надати спрощений API, які не вимагають використання низькорівневих структур типу Pull та Pin):

    • future::poll_fn
    • task::ready!
  • Ознака «const», що визначає можливість використання в будь-якому контексті замість констант, застосована у функції slice:: from_raw_parts.
  • З метою більш компактного зберігання даних змінено розклад пам'яті структур Ipv4Addr, Ipv6Addr, SocketAddrV4 та SocketAddrV6. Можливе порушення сумісності з одиничними пакетами crate, які використовують std::mem::transmute для низькорівневих маніпуляцій зі структурами.
  • У складання компілятора rust для платформи Windows задіяні PGO-оптимізації (profile-guided optimization), що дозволило підняти продуктивність компіляції коду на 10-20%.
  • У компіляторі реалізовано нове попередження про поля, що не використовуються, у певних структурах.

Додатково можна відзначити звіт про стан розробки альтернативної реалізації компілятора мови Rust, підготовленої проектом gccrs (GCC Rust) та схваленої для включення до складу GCC. Після інтеграції фронтенду штатний інструментарій GCC зможе використовуватися для компіляції програм мовою Rust без необхідності встановлення компілятора rustc, побудованого з використанням напрацювань LLVM. Поки технологія йде за планом і якщо не виникне непередбачених проблем, фронтенд для мови Rust буде інтегрований до складу випуску GCC 13, наміченого на травень наступного року. Реалізація Rust в GCC 13 матиме статус бета-версії, доки не включається за умовчанням.

Джерело: opennet.ru

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