Випуск мови програмування Rust 1.75 та unikernel Hermit 0.6.7

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

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

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

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

  • Додана можливість використання «async fn» та нотації «->impl Trait» у приватних типажах. Наприклад, використовуючи "->impl Trait" можна написати метод типажу, що повертає ітератор: trait Container { fn items(&self) -> impl Iterator; } impl Container for MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    Також можна створювати типажі, що використовують "async fn": trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // буде розгорнуто: // fn fetch(&self, url: Url) -> impl Future; }

  • Доданий API для розрахунку байтових зміщень щодо покажчиків. При роботі з голими покажчиками («*const T» та «*mut T») можуть знадобитися операції додавання зміщення до покажчика. Раніше для цього можна було використовувати конструкцію виду «::add(1)», що додає число байтів, що відповідає розміру «size_of::()». Новий API спрощує цю операцію і дає можливість маніпулювати зсувами в байтах без попереднього приведення типів до "const u8" або "mut u8".
    • pointer::byte_add
    • pointer::byte_offset
    • pointer::byte_offset_from
    • pointer::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • Продовжено роботу зі збільшення продуктивності компілятора rustc. До складу доданий оптимізатор BOLT, що працює на стадії після завершення компонування та використовує відомості із заздалегідь підготовленого профілю виконання. Застосування BOLT дозволяє прискорити виконання компілятора приблизно на 2% рахунок зміни розкладки коду бібліотеки librustc_driver.so для більш ефективного використання процесорного кеша.

    Увімкнено складання компілятора rustc з опцією «-Ccodegen-units=1», що дозволяє підвищити якість оптимізації в LLVM. Проведені тести показують збільшення продуктивності у випадку зі складання "-Ccodegen-units=1" приблизно на 1.5%. Додані оптимізації за замовчуванням включаються лише для платформи x86_64-unknown-linux-gnu.

    Раніше вказані оптимізації були випробувані компанією Google для скорочення часу збирання компонентів платформи Android, написаних мовою Rust. Застосування -C codegen-units=1 при складанні Android дозволило знизити розмір інструментарію на 5.5% і збільшити його продуктивність на 1.8%, при цьому час складання самого інструментарію збільшилося майже вдвічі.

    Включення складання сміття під час компонування («gc-sections») дало можливість довести приріст продуктивності до 1.9%, включення оптимізації на етапі зв'язування (LTO) — до 7.7%, а оптимізації на основі профілю виконання коду (PGO) — до 19.8% . У фіналі було застосовано оптимізацію за допомогою утиліти BOLT, що дозволило довести приріст швидкості складання до 24.7%, але розмір інструментарію при цьому зріс на 10.9%.

    Випуск мови програмування Rust 1.75 та unikernel Hermit 0.6.7

  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано методи та реалізації типажів:
    • Atomic*::from_ptr
    • FileTimes
    • FileTimesExt
    • File::set_modified
    • File::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • Option::as_slice
    • Option::as_mut_slice
    • pointer::byte_add
    • pointer::byte_offset
    • pointer::byte_offset_from
    • pointer::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • Ознака «const», що визначає можливість використання в будь-якому контексті замість констант, застосована у функціях:
    • Ipv6Addr::to_ipv4_mapped
    • MaybeUninit::assume_init_read
    • MaybeUninit::zeroed
    • mem::discriminant
    • mem::zeroed
  • Реалізовано третій рівень підтримки для платформи csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd та mipsel-unknown-netbsd. Третій рівень передбачає базову підтримку, але без автоматизованого тестування, публікації офіційних збірок та перевірки можливості складання коду.

Додатково можна відзначити нову версію проекту Hermit, що розвиває спеціалізоване ядро ​​(unikernel), написане мовою Rust, що надає інструментарій для складання самодостатніх додатків, здатних працювати поверх гіпервізора або голого обладнання без додаткових прошарків та без операційної системи. При складанні програма статично зв'язується з бібліотекою, яка самостійно реалізує всю необхідну функціональність, не прив'язуючись до ядра ОС та системних бібліотек. Код проекту розповсюджується під ліцензіями Apache 2.0 та MIT. Підтримується складання для відокремленого виконання програм, написаних мовами Rust, Go, Fortran, C і C++. Також проектом розвивається власний завантажувач, що дозволяє запускати Hermit за допомогою QEMU та KVM.

Джерело: opennet.ru

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