Випуск Rust 1.84. Ядра Tock та Vekos, написані на Rust. Діалект Mini-C

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

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

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

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

  • У пакетному менеджері Cargo стабілізовано механізм обробки залежностей, який вибирає версії залежних компонентів з урахуванням сумісності з версіями компілятора Rust, заявленими як мінімально підтримувані проектом (MSRV, Minimum Supported Rust Version). Нова можливість дозволяє позбавити супровідних від необхідності ручного вибору старих версій кожної залежності в проектах, що зберігають сумісність зі старими версіями інструментарію Rust. Новий режим визначення залежностей буде активовано за замовчуванням у випуску Rust 1.85, а поки доступний у форматі опції, для включення якої у секції «[resolver]» у файлі «.cargo/config.toml» слід вказати 'incompatible-rust-versions = « fallback»'.
  • Розпочато переклад компілятора на новий обробник типів (trait solver), призначений для перевірки меж застосування типів, нормалізації типів та оцінки сумісності типів. У версії 1.84 новий обробник задіяний перевірки узгодженості реалізацій типажів, тобто. оцінки існування не більше одного типажу для типу, що розглядається, з урахуванням коду з інших crate-пакетів. Вказана перевірка дозволила позбавитися проблем у старій реалізації обробника типів, потенційно здатних призвести до появи конфліктів через перетин різних реалізацій типажів.
  • Запропоновано новий API "Strict Provenance", який можна використовувати для приведення покажчика до цілого числа і назад з урахуванням прикріплених до покажчика метаданих з інформацією про його походження та області використання (крім адреси до покажчика прикріплюється значення "provenance" з інформацією про зв'язок з іншими покажчиками , що дозволяє визначити, де і коли покажчик може звертатися до пам'яті). При приведенні покажчика до цілого числа і назад виникає невизначена поведінка через проблематичність відстежити походження результуючого покажчика. Новий API дозволяє виконувати низькорівневі операції з покажчиками, такі як збереження додаткової інформації в молодших бітах покажчика, без приведення покажчика до цілої кількості.
  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано методи та реалізації типажів:
    • Ipv6Addr::is_unique_local
    • Ipv6Addr::is_unicast_link_local
    • core::ptr::with_exposed_provenance
    • core::ptr::with_exposed_provenance_mut
    • ::addr
    • ::expose_provenance
    • ::with_addr
    • ::map_addr
    • ::isqrt
    • ::checked_isqrt
    • ::isqrt
    • NonZero::isqrt
    • core::ptr::without_provenance
    • core::ptr::without_provenance_mut
    • core::ptr::dangling
    • core::ptr::dangling_mut
    • Pin::as_deref_mut
  • Ознака «const» застосована у функціях:
    • AtomicBool::from_ptr
    • AtomicPtr::from_ptr
    • AtomicU8::from_ptr
    • AtomicU16::from_ptr
    • AtomicU32::from_ptr
    • AtomicU64::from_ptr
    • AtomicUsize::from_ptr
    • AtomicI8::from_ptr
    • AtomicI16::from_ptr
    • AtomicI32::from_ptr
    • AtomicI64::from_ptr
    • AtomicIsize::from_ptr
    • ::is_null
    • ::as_ref
    • ::as_mut
    • Pin::new
    • Pin::new_unchecked
    • Pin::get_ref
    • Pin::into_ref
    • Pin::get_mut
    • Pin::get_unchecked_mut
    • Pin::static_ref
    • Pin::static_mut
  • Стабілізовано підтримку асемблерних inline-вставок для архітектур s390x і Arm64EC.
  • Для цільової платформи WebAssembly стабілізовано підтримку функціональності multivalue, reference-types і tail-call.
  • Реалізовано другий рівень підтримки платформи wasm32v1-none. Другий рівень підтримки передбачає гарантію складання.

Додатково можна відзначити кілька проектів, пов'язаних із Rust:

  • Опубліковано реліз операційної системи Tock 2.2, написаної мовою Rust та орієнтованого на використання у мікроконтролерах. Система дозволяє організувати одночасне виконання кількох не заслуговують на довіру додатків на вбудованих пристроях, що мають обмежений розмір ОЗУ, таких як датчики, TPM (Trusted Platform Module), брелоки автентифікації та пристрої, що носяться. Підтримуються платформи із мікроконтролерами на базі архітектур ARM Cortex-M та RISC-V. Ключовою особливістю Tock є ізоляція рівнів додатків, ядра та шару з драйверами, а також ізоляція кожного додатка та драйвера окремо. Для ізоляції використовуються як можливості мови Rust, так і розподіл на рівні захисту пам'яті.
  • Проект VEKOS (Verified Experimental Kernel OS) розвиває ядро ​​операційної системи мовою Rust, що забезпечує верифікацію компонентів, що виконуються. При кожній операції з файловою системою, створення процесу та виділення пам'яті формується криптографічне підтвердження, що дозволяє верифікувати операцію під час виконання (реалізація порівнюється із застосуванням блокчейна для верифікації дій в операційній системі). У файловій системі VKFS для забезпечення цілісності та захисту від спотворення заднім числом задіяна структура «дерево Меркла» (Merkle Tree), кожна гілка в якому верифікує всі гілки і вузли, що знаходяться нижче, завдяки деревоподібному хешированию. Виділення пам'яті виконується у режимі COW (Copy-On-Write).
  • Група дослідників з Microsoft та Inria розвиває підмножину мови Сі - Mini-C, призначене для автоматичної трансляції програм мовою Сі у виставу мовою Rust. На відміну від компілятора c2rust, новий проект дозволяє генерувати Rust-код без використання unsafe, але націлений головним чином перетворення Сі-проектів, що мають формальний доказ надійності. Мається на увазі, що буде простіше спочатку перевести Сі-проект на представлення на Mini-C, в якому не допускаються арифметичні операції з покажчиками, ніж переписування unsafe-блоків після прямої компіляції з Сі до Rust.

    Реалізація компілятора базується на інструментарії KaRaMeL. Mini-C розроблено та випробувано в рамках проекту з переписування на Rust криптографічної бібліотеки HACL*, для якої надано формальний доказ надійності. Подібний доказ був використаний для демонстрації можливості генерувати з Mini-C безпечний код Rust.

  • Деніел Cтенберг (Daniel Stenberg), автор утиліти curl, оголосив про припинення розробки та підтримки проектом Curl альтернативного HTTP-бэкенда, написаного на Rust з використанням бібліотеки Hyper. Як причина вказана відсутність інтересу з боку розробників та користувачів.
  • Анонсовано бета-випуск командної оболонки Fish 4.0, переписаний мовою Rust. Зазначається, що після двох років розробки кодова база Fish була повністю переведена із С++ на Rust. Перехід на Rust дозволив вирішити проблеми з багатопоточністю, отримати сучасний інструментарій, що виявляє помилки на етапі компіляції, підвищити безпеку роботи з пам'яттю та зробити проект привабливішим для нових розробників.
  • Проект Tor опублікував випуск Arti 1.3.2, альтернативної реалізації Tor-клієнта мовою Rust. Arti надає вбудовану бібліотеку, яку можуть використовувати різні програми. Під час створення Arti враховано минулий досвід розробки Tor для того, щоб уникнути відомих архітектурних проблем, зробити проект більш модульним та ефективним. Гілка 1.x відзначена як придатна для використання звичайними користувачами та забезпечує той самий рівень конфіденційності, юзабіліті та стабільності, що й основна реалізація мовою Сі. У новій версії продовжено розробку RPC, поведено підготовку в реалізації підтримки релеїв та додано захист від DoS-атак на Onion-сервіси.
  • Опубліковано випуск ігрового двигуна Bevy 0.15, написаного на Rust. У двигуні використовується датацентрична модель (Data Driven) визначення ігрової логіки, побудована поверх набору готових компонентів Bevy ECS (Entity Component System), які можуть виконуватися паралельно. Підтримується 2D та 3D рендеринг, скелетна анімація, визначення графа рендерингу, система формування сцен, фреймворк для побудови інтерфейсу користувача, внесення змін до сцен та ресурсів без необхідності перезапуску.
  • Опубліковано консольний текстовий редактор Helix 25.01, написаний на Rust та розширюючий ідеї, закладені у vim та neovim. Підтримується інтеграція з LSP-серверами та з Tree-sitter, одночасне виділення кількох блоків, використання кількох курсорів при редагуванні, теми оформлення, налагоджувальний протокол DAP (Debug Adapter Protocol).
  • У браузерний двигун Servo, написаний на Rust, додано підтримку темного режиму оформлення. На 20% скорочено розмір браузера ServoShell. Підтримка web-специфікацій доведена до можливості входу та читання повідомлень у Discord (надсилання повідомлень поки неможлива).
  • Компанія Mozilla представила інструментарій Uniffi for React Native для створення модулів React Native мовою Rust.
  • Проведено тестування продуктивності кодувальників зображень у форматі PNG. Декодувальники на Rust (png, zune-png, wuffs) виявилися швидше за декодувальники на Сі (libpng, spng, stb_image). Наприклад, crate-пакет png (image-rs) обігнав libpng у 1.8 рази на системі x86 та у 1.5 рази на системі ARM. image-rs: 375.401 MP/s (відповідь) 318.632 MP/s (geomean) zune-png: 376.649 MP/s (відео) 302.529 MP/s (geomean) wuffs: 376.205 MP/s (287.181) geomean) libpng: 208.906 MP/с (відео) 173.034 MP/s (geomean) spng: 299.515 MP/s (відео) 235.495 MP/s (geomean) stb_image: 234.353 MP/s (average) 171.505

Джерело: opennet.ru

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