Спільно змінюваний стан у Rust: чи дійсно це корінь усього зла?
Що таке cпільно змінюваний стан і як вирішити цю проблему?
Вступ
На написаня цієї статті мене надихнув відеоролик Тома Кайтчука на YouTube — Why Rust is a significant development in programming languages. Стаття призначена для всіх, хто цікавиться Rust і розробкою ПЗ. Я написала її під час вивчення спільно змінюваних станів у Rust і хочу поділитися своїми знаннями.
Висловлюю щиру подяку своїм колегам Андрію, Іллі й Антону, які приділили час рецензуванню й надали цінні відгуки на цю статтю.
Збір сміття та управління пам’яттю
Часто після успішного виконання завдання в області комп’ютерних наук відбувається вихід на новий рівень абстракції, що допомагає розробляти подальші програми без повного занурення в початкову проблему. Якщо завдання залишається невиконаним, воно може виплисти в зміненому вигляді на наступному рівні абстракції.
Розглянемо приклад управління пам’яттю та збору сміття. Збір сміття — це процес, у ході якого середовище виконання автоматично визначає та звільняє пам’ять, яка більше не потрібна програмі. Це допомагає нам зосередитися на логіці застосунку, не турбуючись про управління пам’яттю.
Хоча впровадження збиральника сміття допомогло частково вирішити проблеми, пов’язані з пам’яттю, виникли інші, — наприклад, потенційні проблеми з продуктивністю. Варто також згадати про пекельні муки під час комбінування різних режимів збиральника сміття. Скажімо, під час інтеграції бібліотек Java та Go і узгодження їх роботи в застосунку на Python «веселощі» вам гарантовані.
Недоліки Rust
Попри те, що в Rust є маса переваг, йому також властиві певні недоліки.
Одна зі складностей подв’язана з підтримкою асинхронного програмування, яке в мовах зі збором сміття відбувається досить безболісно. Хоча в Rust є можливості асинхронного програмування, складність виникає через модель володіння та запозичення, яка робить опрацювання асинхронних операцій значно важчим, ніж в інших мовах.
У Rust також є потужні функції для роботи з загальною пам’яттю, але коли програми на Rust взаємодіють із зовнішніми ресурсами чи системами, необхідно працювати з цими аспектами окремо.
У своєму дописі When Rust hurts Роман Кашицин пише: «Пам’ятайте, що шляхи — це звичайні вказівники, зокрема в Rust. Більшіть операцій із файлами за своєю суттю не є безпечними й можуть призводити до гонитв даних (у широкому сенсі), якщо неправильно синхронізувати доступ до файлів. Наприклад, станом на лютий 2023 року в мене вже шість років як присутній concurrency bug у rustup».
Висновок
Rust, завдяки характерним для неї безпеці й контролю, — це чудовий варіант мови для системного програмування й застосунків, де безпека пам’яті вкрай важлива. Однак розробники мають бути готовими орієнтуватися в тонкощах Rust, як-от модель володіння й запозичення, асинхронний код і небезпечний код.
Думки, висловлені в статтях на сайті, належать виключно авторам і можуть не збігатися з думкою редакції або учасників Anywhere Club.