Випуск RUST 1.99.0. Microsoft переклав Rust до первинних мов

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

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

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

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

  • Надано можливість створення мовою Rust функцій зі змінним числом аргументів (variadic), що експортуються для виклику з проектів мовою Сі (C ABI). Як останній елемент списку параметрів у подібних функціях може вказуватися конструкція «...», яка обробляється в Rust за допомогою спеціального типу VaList, що працює аналогічно va_list в C. ()}; let b = unsafe { args.next_arg:: ()}; a + b } fn foo() -> i32 { unsafe { sum(0i32, 2i32) } }
  • Стабілізовані функції Layout::for_value_raw, mem::size_of_val_raw та mem::align_of_val_raw, що дозволяють безпечно визначати розмір та вирівнювання за сирими покажчиками (raw pointer), у тому числі при використанні типів з динамічним розміром, таких як зрізи, без необхідності.
  • У документацію додано рекомендацію уникати звільнення пам'яті, на яку було отримано статичне посилання з необмеженим часом життя (&'static) через виклик Box::leak (round-trip unleaking), так як подібна дія потенційно може призвести до проблем через несумісність з майбутніми оптимізаціями компі. Замість створення статичного посилання для тимчасової передачі володіння рекомендується використовувати сирі покажчики, наприклад через виклик Box::into_non_null.
  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано методи та реалізації типажів:
    • IntoIterator for Box<[T; N]>
    • IntoIterator for &Box<[T; N]>
    • IntoIterator for &mut Box<[T; N]>
    • VecDeque::retain_back
    • core::ffi::VaList
    • Box::into_non_null
    • Box::from_non_null
    • Vec::into_parts
    • Vec::from_parts
    • core::mem::size_of_val_raw
    • core::mem::align_of_val_raw
    • core::alloc::Layout::for_value_raw
    • String::from_utf8_lossy_owned
    • string::FromUtf8Error::into_utf8_lossy
    • ЗанедбанийІтератор для StepBy
    • std::fs::set_times
    • std::fs::set_times_nofollow
  • У пакетному менеджері cargo реалізований новий вбудований профіль «debug», аналогічний до профілю «dev» (у майбутньому можливості для налагодження та розробки планують розділити). При складанні в CI за умовчанням вимкнено інкрементальну компіляцію.
  • Цільова платформа riscv64-unknown-linux-musl переведена на другий рівень підтримки, який передбачає гарантію складання, але відсутність гарантій при проходженні тестового набору.

Додатково можна відзначити нещодавно анонсовані проекти та події, пов'язані з Rust:

  • Компанія Microsoft перевела Rust до мов першого рівня і забезпечить його повну підтримку на всіх етапах розробки всередині компанії. До цього перший рівень підтримки всередині компанії надавалися для мов C++, C# та TypeScript. Зазначається, що Rust вже використовується у понад 100 репозиторіях Microsoft. Серед іншого компоненти на Rust вже застосовуються в таких продуктах, як Microsoft 365 та Copilot, а для компілятора MSVC підготовлений окремий бекенд rustc_codegen_utc для Rust, заснований на компіляторі rustc.

    Як основна мета застосування Rust у Microsoft згадується посилення захищеності коду, критичного з погляду безпеки. За словами технічного директора Microsoft Azure, близько 70% усіх уразливостей у Windows викликані проблемами при роботі з пам'яттю, яких можна уникнути під час використання Rust.

  • Компанія Google видалила з ядра Linux стару реалізацію механізму міжпроцесної взаємодії Binder, написану мовою Сі, на користь нового драйвера Binder IPC, переписаного на Rust. Зазначається, що за 15 років існування старого драйвера в ньому накопичилися значний технічний обов'язок і безліч ускладнень, які ускладнювали пошук помилок, супровід та додавання нових можливостей. Драйвер Binder IPC на Rust визнаний основним і більше не подається як експериментальна технологія.
  • Опубліковано випуск Arti 2.7.0, реалізації інструментарію Tor, написаної мовою Rust. Коли код Arti досягне рівня, здатного повністю замінити варіант на Сі, розробники Tor мають намір надати Arti статусу основної реалізації Tor і поступово припинити супровід реалізації на Сі. У новій версії прокладено розвиток функціональності для релеїв та серверів директорій (Directory Authority), пов'язаної з парсингом документів, підтримкою дзеркалювання серверів директорій та обробкою DNS-трафіку. Додана реалізація RPC для зміни та перевірки конфігурації. Усунено кілька вразливостей - адміністраторам onion-сервісів рекомендовано терміново оновити свої системи.

Джерело: opennet.ru

Купити надійний хостинг для сайтів із захистом від DDoS, VPS VDS сервери 🔥 Купити надійний хостинг для сайтів із захистом від DDoS, VPS VDS сервери | ProHoster