Rust 1.87: Нові можливості та поліпшення мови програмування

Rust 1.87: Нові можливості та поліпшення мови програмування

У день святкування десятиліття з моменту випуску мови програмування Rust 1.0 (проект Rust був заснований у 2006 році, випуск 0.1 був сформований у 2012 році, а перша стабільна версія запропонована в 2015 році) опублікований реліз Rust 1.87. Мова програмування Rust сфокусована на безпечній роботі з пам’яттю та надає засоби для досягнення високого паралелізму виконання завдань, при цьому обходиться без використання збирача сміття та runtime (runtime зводиться до базової ініціалізації та супроводу стандартної бібліотеки).

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

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

Основні новації Rust 1.87

В стандартну бібліотеку додано підтримку неіменованих каналів (anonymous pipe). Для створення неіменованих каналів запропоновано метод std::io::pipe(), який може використовуватися в поєднанні з std::process::Command для обробки стандартних вхідних і вихідних потоків, а також для об’єднання потоків stdout і stderr.

Дозволено виклик із safe-коду більшості вбудованих у компілятор функцій (Intrinsics) std::arch. Зміна застосовується до вбудованих функцій std::arch, які позначені unsafe лише через прив’язку до певної функціональності, якщо ця функціональність включена. Наприклад, _mm256_add_epi32 можна викликати з safe-коду, якщо в додатку використовується ‘#[target_feature(enable = “avx2”)]’.

З блоків “asm!” з асемблерним кодом дозволено здійснювати переходи на блоки з кодом на мові Rust. Це спрощує розробку низькорівневого коду, наприклад, реалізації оптимізацій в ядрі або організації взаємодії з обладнанням. Точка для переходу для асемблерної команди “jmp” задається в макросі “asm!” за допомогою нового операнда “label”, що містить блочний вираз з кодом на мові Rust.

Нові API та поліпшення в Rust 1.87

В розряд стабільних переведена нова порція API. Стабілізовано численні методи та реалізації типажів, включаючи Vec::extract_if, LinkedList::extract_if, String::extend_from_within, io::pipe, OsString::display та багато інших.

Ознака “const” застосована в багатьох функціях, таких як core::str::from_utf8_mut, <[T]>::copy_from_slice, SocketAddr::set_ip, char::is_digit, String::into_bytes, Vec::as_slice та інші. Це дозволяє використовувати ці функції в константних контекстах.

Крім того, видалено другий рівень підтримки для цільової платформи i586-pc-windows-msvc. Рекомендується використовувати платформу i686-pc-windows-msvc, яка відрізняється підтримкою інструкцій SSE2. Платформа i586-pc-windows-msvc втратила сенс, оскільки для Windows 10 необхідна підтримка SSE2, а більш ранні випуски Windows в Rust не підтримуються.

Дозволено точно вказувати захоплені узагальнені типи та час життя у визначеннях типажів з використанням типів, що повертаються, impl Trait. Це підвищує гнучкість при роботі з типажами та поліпшує виразність коду.

Більше інформації про новий реліз можна знайти в офіційному анонсі Rust 1.87. Мова програмування Rust продовжує розвиватися, надаючи розробникам все більше можливостей для створення безпечного та ефективного коду.