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

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

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

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

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

  • Надано можливість визначення власних кодів повернення з функції main. Спочатку функція main в Rust могла повертати тільки тип (()) (unit), що завжди вказувало на успішний статус завершення, якщо розробником явно не викликана функція process:: exit (code). У Rust 1.26 за допомогою нестабільного типажу Termination функції main була надана можливість повернення значень «Ok» і «Err», відповідних кодам EXIT_SUCCESS і EXIT_FAILURE в програмах мовою Сі. У Rust 1.61 типаж Termination переведений у розряд стабільних, а для подання конкретного коду повернення запропоновано окремий тип ExitCode, який абстрагує специфічні для платформи типи значень, що повертаються, надаючи як зумовлені константи SUCCESS і FAILURE, так і метод From для повернення довільного коду повернення. use std::process::ExitCode; fn main() -> ExitCode { if !check_foo() { return ExitCode::from(8); } ExitCode::SUCCESS }
  • Стабілізовані додаткові можливості функцій, визначених з використанням виразу const fn, які можуть викликатися не тільки як звичайні функції, але і використовуватися в будь-якому контексті замість констант. Дані функції обчислюються на етапі компіляції, а не в ході виконання, тому на них накладаються певні обмеження, такі як можливість читання лише з констант. У новій версії всередині const-функцій дозволено базові операції з покажчиками на функції (дозволено створення, передача та приведення покажчиків, але не виклик функції за вказівником); обмеження типажів (trait bounds) для узагальнених параметрів const-функцій, таких як T: Copy; динамічно диспетчеризовані типажі (dyn Trait); типи impl Trait для аргументів і значень функції, що повертаються.
  • Дескриптори потоків Stdin, Stdout і Stderr у std::io тепер мають статичний час життя («static») при блокуванні, що дозволяє використовувати конструкції виду «let out = std::io::stdout().lock();» з отриманням дескриптора та виставленням блокування в одному виразі.
  • У розряд стабільних переведено нову порцію API, у тому числі стабілізовано методи та реалізації типажів:
    • Pin::static_mut
    • Pin::static_ref
    • Vec::retain_mut
    • VecDeque::retain_mut
    • Write для Cursor<[u8; N]>
    • std::os::unix::net::SocketAddr::from_pathname
    • std::process::ExitCode
    • std::process::Termination
    • std::thread::JoinHandle::is_finished
  • Ознака «const», що визначає можливість використання в будь-якому контексті замість констант, застосована у функціях:
    • <*const T>::offset та <*mut T>::offset
    • <*const T>::wrapping_offset та <*mut T>::wrapping_offset
    • <*const T>::add та <*mut T>::add
    • <*const T>::sub та <*mut T>::sub
    • <*const T>::wrapping_add та <*mut T>::wrapping_add
    • <*const T>::wrapping_sub та <*mut T>::wrapping_sub
    • <[T]>::as_mut_ptr
    • <[T]>::as_ptr_range
    • <[T]>::as_mut_ptr_range

Додатково можна відзначити статтю «Rust: A Critical Retrospective» із узагальненням вражень про мову Rust після написання ним 100 тисяч рядків коду в процесі розробки мікроядерної операційної системи Xous, яка використовується в прошивках. З недоліків відзначається важкий для сприйняття синтаксис, незавершеність та продовження розвитку мови, відсутність повторюваних збірок, типові проблеми з довірою до залежностей у Crates.io, необхідність дотримання певної дисципліни для написання безпечного коду. З можливостей, що перевершили очікування, згадуються засоби для рефакторингу коду та переробки «хаків», доданих при швидкому створенні прототипів.

Джерело: opennet.ru

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