3019

Чому мова програмування Rust така популярна?

Rust був створений для забезпечення високої продуктивності, аналогічної до тієї, що пропонують C і C++, але з упором на безпеку коду, що є ахіллесовою п'ятою цих двох мов. Проте безпека – це єдина причина популярності цієї мови. Висока продуктивність при обробці великих обсягів даних, підтримка паралельного програмування, а також наявність ефективного компілятора - інші причини, з яких відомі «важковаговики» IT-галузі вважають за краще використовувати Rust у своїх розробках. До них належать Firefox, Dropbox, Cloudflare та багато інших відомих компаній.

У цій статті ми розповімо про основні характеристики Rust, про те, для чого він використовується і чому варто подумати про його впровадження у свої програмні проекти.

Зростаюча популярність Rust

За даними опитування, проведеного в 2021 році профільним ресурсом Stack Overflow серед більш ніж 80 000 розробників, Rust впевнено посів перше місце як найулюбленішу мову програмування. І цю позицію мова утримує шостий рік поспіль.

2020 року розробники ядра Linux запропонували писати новий код ядра Linux на Rust. Що цікаво, вони запропонували не переписувати все ядро, яке спочатку було написане на C, а додати новий код на Rust, який працюватиме з існуючою інфраструктурою. Цю ініціативу підтримав сам Лінус Торвальдс, батько операційної системи Linux. Ця ідея знаходиться в постійній розробці - на даний момент вона все ще описується як експериментальна, але "досить хороша, щоб розробники ядра могли почати працювати над абстракціями Rust для підсистем та писати драйвери та інші модулі".

Google також планує використовувати Rust у ядрі Linux після підтримки мови системного програмування Rust на Android. Цей перехід спрямовано усунення недоліків безпеки. Компанія Microsoft також не залишилася осторонь і звернулася до технології Rust, щоб зменшити кількість помилок у компонентах Windows, пов'язаних із пам'яттю.

Facebook також налагодив тісніші зв'язки з Rust, приєднавшись до Rust Foundation, організації, створеної в 2021 році для розвитку Rust для перетворення його на основну кращу мову для системного програмування. До Facebook це вже зробили Amazon Web Services, Google, Huawei, Microsoft та Mozilla. Все це очевидні ознаки того, що Rust має дуже хороші перспективи.

Що такого особливого у мові Rust?

Rust – це мова програмування зі статичною типізацією, розроблена для підвищення продуктивності та безпеки, особливо для безпечного паралелізму та управління пам'яттю. Його синтаксис нагадує синтаксис C++. Цей проект з відкритим кодом розроблено фахівцями Mozilla Research. У 2021 році було створено Rust Foundation, який перейняв естафету та став рушійною силою розвитку мови.

Rust вирішує проблеми, з якими тривалий час боролися розробники C/C++: помилки пам'яті та паралельне програмування. Це вважається його основною перевагою. Однак це не єдині приклади того, що Rust вигідно відрізняється від C/C++. Звичайно, можна заперечити, що сучасний C++ приділяє більше уваги безпеці пам'яті (наприклад, шляхом реалізації інтелектуальних покажчиків), але багато проблем залишаються невирішеними. Один із них — «використовувати після звільнення помилок», які трапляються, коли програма продовжує використовувати покажчик після того, як його було звільнено, наприклад, виклик лямбда-функції після звільнення захоплених об'єктів посилання.

З іншого боку, у Rust є засіб перевірки запозичення - частина компілятора, яка стежить за тим, щоб посилання не пережили дані, на які вони посилаються. Ця функція допомагає усунути помилки порушення пам'яті. Такі проблеми виявляються під час компіляції, і збирання сміття не потрібно.

Крім того, в Rust у кожного посилання є час життя, де можна встановити область дії, для якої це посилання дійсне. 

Ця функція вирішує проблему з більш недійсними посиланнями, а також вигідно відрізняє Rust C/C++. Важливість правильного керування пам'яттю стає очевидною на наступному прикладі: за останні 12 років близько 70% всіх помилок безпеки в продуктах Microsoft були пов'язані з безпекою пам'яті. Приблизно такі проблеми характерні і для Google Chrome.

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

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

Дворежимна модель Rust - одна з його найбільших переваг. З іншого боку, у C++ ви ніколи не дізнаєтеся, що написали небезпечний код, поки десь у майбутньому ваше програмне забезпечення не вийде з ладу або не виникне пролом у системі безпеки.

Паралельне програмування з Rust стало простіше

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

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

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

Інші мови використовують методи синхронізації, але вони не пов'язані з об'єктами, на які посилаються. Саме розробник повинен подбати, щоб заблокувати об'єкт перед його використанням. Наприклад, C/C++ компілятор дозволяє розробнику писати код з помилками. В результаті помилки виявляються, коли програма вже знаходиться в продакшені, або, що ще гірше, коли хтось намагається її зламати. У мові Rust багато проблем, пов'язаних з паралельним програмуванням (хоч і не всі), вирішено, оскільки вони виявляються відразу під час компіляції.

Деякі перешкоди, які необхідно подолати під час програмування на Rust

Rust — відносно нова технологія, тому деякі бібліотеки можуть бути ще недоступні. Тим не менш, бібліотека пакетів Rust, запущена в 2016 році, швидко зростає, а активна спільнота розробників Rust є гарною ознакою для подальшого розвитку.

Розробників, які не звикли працювати з мовою, де помилки в коді виявляються під час компіляції, може дратувати отримання великої кількості повідомлень. В результаті розробка коду відбувається не так швидко, як іншими популярними мовами, таких як Python.

Однак розробники Rust роблять все можливе, щоб зробити ці повідомлення про помилки якомога більш інформативними та ненав'язливими.

І останнє, але не менш важливе: написання коду на Rust вимагає більше зусиль, оскільки поріг входу досить високий. Потрібно витратити деякий час на освоєння мови. Також потрібно добре знання C++ або будь-якої іншої об'єктно-орієнтованої мови програмування. Але якщо ви подолаєте всі ці перешкоди, переваги використання Rust стануть найкращою нагородою за ваші зусилля.

Для чого використовується Rust

Rust - це вже "зріла" технологія, яка використовується у виробництві. Як мова системного програмування, вона дозволяє контролювати деталі низького рівня. Ви можете вибрати, чи зберігати дані в стеку (використовується для статичного виділення пам'яті) або в купі (використовується для динамічного виділення пам'яті). Тут також важливо згадати про RAII (Resource Acquisition Is Initialization), ідіом коду, яка в основному пов'язана з C++, але також присутня в Rust: щоразу, коли об'єкт виходить за межі області видимості, викликається його деструктор і звільняються ресурси, що йому належать. З Rust не потрібно робити це вручну - ви повністю захищені від помилок витоку ресурсів. Зрештою, це дозволяє більш ефективно використовувати пам'ять.

Оскільки в Rust немає постійного збирача сміття, його проекти можуть використовуватися в якості бібліотек іншими мовами програмування через інтерфейси сторонніх функцій. Це ідеальний сценарій для існуючих проектів, де важливо забезпечити високу продуктивність збереження безпеки пам'яті. У таких проектах код Rust може замінити деякі частини програмного забезпечення, де продуктивність відіграє вирішальну роль без необхідності переписувати весь продукт.

Rust - це низькорівнева мова програмування з прямим доступом до обладнання та пам'яті, що робить його відмінним рішенням для розробки вбудованих систем та розробки на "голому залізі". Ви можете використовувати Rust для написання операційних систем або програм для мікроконтролерів. 

Насправді вже існує ряд операційних систем, написаних на Rust, наприклад: Redox, intermezzOS, QuiltOS, Rux і Tock. Mozilla, де спочатку була розроблена ця мова, використовує її у своїх браузерних двигунах.

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

Підсумовуючи, основні плюси використання Rust:

  • Висока продуктивність при забезпеченні безпеки пам'яті
  • Підтримка паралельного програмування
  • Зростаюча кількість пакетів Rust у репозиторії crates.io
  • Активне співтовариство, що сприяє розвитку мови
  • Забезпечено зворотну сумісність та стабільність.

Висновок

У Rust чудова продуктивність, інструменти та активна спільнота, яка постійно працює над покращенням мови. Більше того, якщо вам потрібне рішення з більшою увагою до безпеки, ніж C/C++, і ви не хочете жертвувати швидкістю, Rust — гарний вибір. Якщо ви турбуєтеся, що Rust може бути недостатньо зрілим для вашого проекту, відкиньте сумніви геть. Десятки компаній, таких як Figma, 1Password або Amazon вже використовували Rust у своїх розробках.