У 2023 році у нас буде тисяча причин вивчити Rust.
7 серпня фонд Rust Foundation опублікував результати звіту Rust Survey за 2022 рік. Звіт показує, що рівень впровадження Rust продовжує зростати. Більше 90% респондентів опитування вказали, що вони є користувачами Rust; Rust використовується для більшість роботи з кодування в , значне зростання на 51,8% порівняно з попереднім роком.
Немає сумніву, що Rust все більше привертає увагу розробників завдяки чудовій безпеці пам’яті та продуктивності паралелізму. Однак також важко ігнорувати Go, відносно «старого» гравця, який колись був обраний мовою програмування року.
Народжена в 2009 році мова Go привернула велику увагу завдяки унікальній моделі паралелізму та потужним перевагам продуктивності. Варто зазначити, що, як і мова Rust, творець мови Go також «ненавидить» C++, і Go також є домінуючою мовою хмарного нативу.
В опитуванні розробників Stack Overflow 2022 серед 70 000 відповідей на запитання «мова програмування, яка змушує людей любити та ненавидіти» програмісти, очевидно, віддають перевагу Rust, 86% із них сказали, що їм подобається Rust, а 64% сказали, що їм подобається Go. Зіткнувшись із гарячим статусом Rust, деякі розробники запитали себе: чи варто вивчати Go у 2023 році?
Крім того, за останні два дні питання про те, чи вибрати Rust чи Go, також стало гарячою темою на Hacker News:
Користувач мережі, який підтримує Rust, сказав: «Мене також турбував цей вибір протягом тривалого часу. Зрештою Rust переміг. По-перше, я відчуваю, що Rust ближче до речей попередньої ери Pascal, і ви можете контролювати все. ; по-друге, якщо wasm і пов’язані з ним технології є великим спалахом, Rust був би безпечнішим вибором; тоді ми вже маємо Python для швидкого розвитку, тому має сенс вибрати щось трохи екстремальніше, а Go є дещо посередині. Нарешті, Rust слід використовувати для Core і високого профілю, тому його навряд чи можна буде усунути».
Інший розробник, який не погоджувався, сказав: «Я займаюся розробкою в Go вже майже десять років, але нещодавно я також спробував Rust. Я думаю, що наразі є певні обов’язкові та оманливі переваги Rust, з мого досвіду в From, досвіду в різних стартапах, включаючи мій поточна, Go є, безумовно, найкращим вибором для бекенд-розробки! Зверніть увагу, продуктивність, функціональність чи щось інше... дві мови дуже, дуже схожі!»
Треба сказати, що і Go, і Rust є чудовими мовами програмування. Вони сучасні, потужні, універсальні та забезпечують чудову продуктивність. Але насправді немає сенсу прямо порівнювати Go та Rust, хто з них кращий, оскільки кожна мова програмування являє собою серію глибоких компромісів, що стоять за нею. Різні мови будуть оптимізовані для різних потреб, тому, коли ми вибираємо мову, ми також повинні враховувати, для вирішення яких проблем ми хочемо її використовувати. Отже, ми почнемо з застосовних сценаріїв мов Go і Rust і обговоримо «шлях» дизайну Go і Rust.
Хоча Rust і Go сильно відрізняються за синтаксисом і стилем, обидва є першокласними інструментами для створення програмного забезпечення. Давайте почнемо конкретний аналіз нижче.
Go vs. Rust: Подібності
Rust і Go мають багато спільного, тому люди часто порівнюють їх. Які у них спільні цілі?
Rust — це низькорівнева статично типізована багатопарадигмальна мова програмування з більшою увагою до безпеки та продуктивності.
—Гінтс Дрейманіс
і:
Go — це мова програмування з відкритим кодом, яка дозволяє легко створювати просте, надійне та ефективне програмне забезпечення.
—golang.org
Безпека пам'яті
І Go, і Rust належать до сучасних мов програмування, які приділяють особливу увагу безпеці пам’яті. За десятиліття розробки старих мов, таких як C і C++, стало зрозуміло, що однією з основних причин помилок і помилок є небезпечний/некоректний доступ до пам’яті.
Отже, Rust і Go надали різні рішення, але мета обох — бути розумнішими та безпечнішими з точки зору керування пам’яттю, а також допомогти розробникам писати правильні програми з чудовою продуктивністю.
Швидкий, компактний виконуваний файл
Обидві є скомпільованими мовами, що означає, що програми можуть бути переведені безпосередньо у виконуваний машинний код, так що програми можуть бути розгорнуті як один бінарний файл. На відміну від інтерпретованих мов, таких як Python і Ruby, нам не потрібно додавати інтерпретатор і багато бібліотек/залежностей разом із програмою. Як пряме відображення цієї основної переваги, програми Rust and Go працюють швидше, ніж інтерпретовані мови.
Мова загального призначення
І Rust, і Go — це потужні та розширювані мови програмування загального призначення, які можна використовувати для розробки будь-якого сучасного програмного забезпечення — від веб-додатків до розподілених мікросервісів, вбудованих мікроконтролерів, мобільних додатків тощо. **Обидва мають чудові стандартні бібліотеки та процвітаючі екосистеми сторонніх розробників, а також потужну комерційну підтримку та велику базу користувачів. **Обидва існують протягом багатьох років і продовжуватимуть процвітати в наступні роки. Сьогодні вивчення Go або Rust було б розумною інвестицією часу та енергії.
Прагматичний стиль програмування
Вони також не є занадто функціональними мовами (наприклад, Scala або Elixir), а також не повністю об'єктно-орієнтованими (наприклад, Java і C#). Навпаки, хоча і Go, і Rust мають функції функціонального та об’єктно-орієнтованого програмування, вони завжди наголошують на прагматичній орієнтації, тобто вирішують проблему найбільш прийнятним способом, а не змушують усіх використовувати специфічний метод через «ідеологію».спосіб робити речі. **Але якщо вам справді подобається функціональний стиль програмування, на стороні Rust є більше пов’язаних інструментів, що є однією з переваг Rust над Go. **
Ми, безумовно, можемо сперечатися про те, що являє собою справді «об'єктно-орієнтовану» мову. Але чесно кажучи, стиль об’єктно-орієнтованого програмування, якого очікують користувачі C++, Java чи C#, насправді не існує в Go чи Rust.
— Джек Мотт
Великий розвиток
І Rust, і Go надають багато корисних функцій для широкомасштабного програмування, тож обидва вони можуть адаптуватися до реальних потреб великих команд розробників і великих кодових баз. **Наприклад, програмісти на C роками сперечалися про те, куди вставляти дужки та чи слід робити відступи в коді табуляціями чи пробілами; але Rust і Go вже використовують стандартні засоби форматування (Go має gofmt, Rust це rustfmt) повністю вирішують ці проблеми. проблеми. Вони автоматично переписують ваш код, використовуючи відповідний стиль.
Справа не в тому, що цей конкретний формат є тонким, але **програмісти Rust and Go є більш прагматичними і радше оберуть єдиний стандарт реалізації. **
Стиль gofmt може бути не всім улюбленим, але у gofmt є щось для кожного.
— Роб Пайк
Ще одна велика перевага цих двох мов відображена в конвеєрі збірки. Обидва мають чудові, вбудовані та ефективні стандартні інструменти збірки та керування залежностями. Це означає, що програмістам не потрібно боротися зі складними сторонніми системами збирання, а також їм не потрібно вивчати нову систему кожні кілька років.
Я використовував Java і Ruby на початку своєї кар’єри, тому написання коду Go і Rust завжди було трохи лякаючим і поза моїм контролем. Але коли я зайшов у Google і побачив сервіс, написаний на Go, я відчув справжнє полегшення, тому що мені стало легко створювати та запускати.
Те саме стосується Rust. Хоча я досліджував лише невеликі проекти, я бачу простоту використання. Мені б хотілося, щоб ці нескінченно настроювані системи збирання залишилися в минулому, тепер, коли нові мови постачаються зі своїми спеціальними інструментами збирання, які працюють із коробки, хіба це не добре?
—Сем Роуз
**Іржавіти чи піти? **
Після такої кількості розмов про те, що обидві мови настільки добре розроблені та потужні, чи є якийсь результат у цьому конкурсі? Або, оскільки обидва є чудовими варіантами, чому люди досі обурюються в соціальних мережах, пишуть довгі коментарі в блогах, кажучи, що «Rust — це для ідіотів» або «Go — це зовсім не мова програмування». Різкі слова?
Звичайно, декому просто хочеться виплеснути емоції, але це явно не допомагає вирішити справжню проблему. Принаймні, коли йдеться про те, яку мову використовувати в проекті чи яку мову використовувати для проникнення у світ програмування, гучні голоси явно не допоможуть зробити правильний вибір.
Давайте повернемося до обговорення дорослих і подивимося, які сильні та слабкі сторони Rust і Go мають за раціонального аналізу.
Go проти Rust: продуктивність
Як згадувалося раніше, програми, згенеровані Go та Rust, обидві швидкі, оскільки вони компілюються до рідного машинного коду без використання інтерпретатора чи віртуальної машини. Але продуктивність Rust все ще краща, навіть порівнянна з C і C++, які відомі як галузеві еталони продуктивності. І на відміну від цих старомодних мов, Rust також забезпечує захист пам’яті та механізми безпеки паралелізму, майже не впливаючи на швидкість виконання. Rust також дозволяє розробникам створювати складні абстракції без зниження продуктивності під час виконання.
Навпаки, Хоча продуктивність програм Go також хороша, у дизайні головним чином зосереджена швидкість розробки (включаючи компіляцію), а не ступінь виконання. Програмісти Go віддають перевагу чіткому та читабельному коду, тому швидкість роботи трохи нижча.
Компілятор Go також не витрачає багато часу на створення найефективнішого машинного коду, він більше стурбований швидким компілюванням великої кількості коду. **Тож у тестах виконання програми Rust часто переважає програму Go. **
Продуктивність Rust під час виконання також є дуже стабільною та передбачуваною, оскільки він не використовує збирання сміття. Збирач сміття Go дуже ефективний і оптимізований, щоб час паузи був якомога коротшим (час паузи скорочується з кожним випуском Go). Але в будь-якому разі збирання сміття завжди вносить деяку непередбачуваність у поведінку програми, і це може бути серйозним або навіть абсолютно неприйнятним для певних програм (таких як вбудовані системи).
Оскільки мета Rust — надати програмісту повний контроль над апаратним забезпеченням, що лежить в основі, **програми Rust можна глибоко оптимізувати для наближення до максимальної теоретичної продуктивності машини. **Це робить Rust найкращим вибором для певних випадків використання, де швидкість виконання перевершує все інше, наприклад програмування ігор, ядра операційної системи, компоненти веб-браузера та системи керування в реальному часі.
Простота
Немає значення, наскільки потужною є мова програмування, якщо її надто складно вивчити й вона не дає змоги більшості людей. Go, здається, навмисно розроблений, щоб відрізнятися від мов дедалі більшої складності, таких як C++: **У нього дуже мало синтаксису, дуже мало ключових слів і навіть не так багато функцій. **
Це означає, що мову Go легко вивчити, і ви можете писати на ній різні програми після невеликого розуміння.
Go дуже легко навчитися. Я вже багато чув про це, але після використання я все ще вражений тим, як швидко це підвищує продуктивність. Завдяки мові Go, пов’язаній документації та інструментам я написав цікавий і придатний для комісії код лише за два дні.
—Перші враження програміста Rust про Go
Ключовим тут є "простота" три слова. Звичайно, просто не означає легко. Але маленьку і просту мову, безумовно, легше вивчити, ніж велику і складну мову. Існує не так багато способів досягнення одного ефекту, тому високоякісний код Go майже завжди виглядає однаково. Це має ще одну перевагу: ми можемо швидко зрозуміти, що робить служба, з якою ми не знайомі.
**Основна онтологія Go невелика, але стандартна бібліотека дуже потужна. **Тобто, окрім синтаксису Go, наша крива навчання також має враховувати цю частину стандартної бібліотеки.
З іншого боку, перенесення функцій з мови на стандартну бібліотеку означає, що кожному потрібно лише зосередитися на вивченні бібліотек, пов’язаних із поточними потребами розробки. **Go також розроблено з повним урахуванням потреб великомасштабної розробки програмного забезпечення та може підтримувати великі кодові бази та групи розробників. **У цьому типі сценарію нові розробники повинні мати можливість швидко розпочати роботу. З цією метою спільнота Go завжди віддавала пріоритет простоті, зрозумілості, універсальності та прямоті програм.
Використовуючи мову GO, молодшим розробникам часто легше бути продуктивними, але розробникам середнього рівня важче вводити складні абстракції, що створює проблеми. Через цю характеристику Rust має тенденцію бути менш привабливим, ніж Go у світі розробки корпоративного програмного забезпечення.
— Лоріс Кро
Функція
Rust підтримує більшу складність, ніж деякі інші мови програмування, тому відповідний обсяг реалізації також більший.
— Деватон
**Rust спеціально розроблено для включення різноманітних потужних і корисних функцій, які допомагають програмістам робити більше з меншим кодом. **Наприклад, функція відповідності Rust дає змогу швидко писати гнучку та виразну логіку:
Але також через те, що Rust має багато конструктивних міркувань, його складніше вивчити, особливо на початковому етапі. Але це гаразд, зрештою, C++ або Java є чому навчитися, і вони навіть не пропонують розширені функції Rust, такі як безпека пам’яті. Отже, дійсно нерозумно критикувати надто складний звук Rust: він розроблений, щоб підкреслити експресію та багаті функції, ми не можемо очікувати, що він буде таким простим і чистим, використовуючи всі переваги. Тож, звичайно, Rust має власну криву навчання. Але допоки ця складність буде подолана, попереду буде гладка дорога.
Якщо ви готові вивчити складніший синтаксис і семантику (і вищу планку читабельності коду) в обмін на найвищий рівень продуктивності, Rust може навіть конкурувати з C++ і D. — Дейв Чейні
**Незважаючи на те, що Rust і Go запозичують деякі функції один у одного (наприклад, загальні), можна сказати, що функції Rust все ще кращі, а функцій Go відносно бракує. **
Параллельність
Більшість мов надають певну підтримку паралельного програмування (тобто виконання кількох операцій одночасно), але Go розроблено для цього з нуля. **Go не використовує потоки операційної системи, але пропонує легку альтернативу: goroutines. **Кожна підпрограма go — це функція Go, що виконується незалежно, і яку планувальник Go відображає одному з потоків операційної системи під керуванням. Тобто планувальник може дуже ефективно керувати великою кількістю одночасних підпрограмм, використовуючи лише обмежену кількість потоків операційної системи.
Таким чином, ми можемо запускати мільйони одночасних goroutines в одній програмі, не турбуючись про серйозні проблеми з продуктивністю. Через це **Go є повним рішенням для сценаріїв великомасштабних одночасних програм, таких як веб-сервери та мікросервіси. **
Go також надає канали для goroutines, що є швидким, безпечним і ефективним способом спілкування та обміну даними. Рівень паралелізму Go справді дуже високий, а досвід використання досить спокійний і приємний.
Загалом розробка паралельних програм є дуже складною, а створення надійних і правильних паралельних програм будь-якою мовою аж ніяк непросте. Однак, оскільки ця вимога була врахована на початку проекту, механізм паралельного програмування в Go був максимально простим і добре інтегрованим.
Go спрощує створення ретельно деконструйованої програми, яку можна розгортати як набір мікросервісів і повністю використовувати переваги одночасного виконання. Це не неможливо в Rust, просто це важче реалізувати. У певному сенсі Rust більше підходить для програмістів, які не повинні допускати дірок у безпеці, викликаних проблемами з пам’яттю; але, відповідно, коли вони виконують деякі завдання, відносно прості для інших мов (включно з GO), вони віддають перевагу Треба платити більше зусиль. — Соня Коптьєва
Навпаки, механізм паралелізму в Rust щойно приземлився і ще не стабілізувався, тож усі можуть продовжувати приділяти увагу цьому активному напрямку розвитку. Це також корисно. Наприклад, бібліотека районів Rust надає дуже елегантний і легкий метод, який може перетворювати послідовні обчислення в паралельні обчислення.
Було б дуже добре мати легкий синтаксис для створення goroutines і використання каналів. Це прямий прояв потужності граматики, а різні дрібні деталі також роблять досвід паралельного програмування Go набагато кращим, ніж інші мови.
—Перші враження програміста Rust про Go
Хоча це може бути непросто реалізувати паралельні програми в Rust, це все одно цілком можливо, і** ці програми також отримують користь від ретельно розроблених гарантій безпеки пам’яті Rust. **Візьмемо для прикладу клас Mutex стандартної бібліотеки: у Go ми можемо забути отримати м’ютекс перед доступом до чогось; але в Rust про це взагалі не потрібно турбуватися.
Go зосереджується на паралельності як одній із основних концепцій. Це не означає, що ми не можемо досягти ефекту паралелізму, подібного до Go в Rust, але складність реалізації є певним випробуванням для програмістів. Go зосереджується на паралельності як одній із основних концепцій. Це не означає, що ми не можемо досягти ефекту паралелізму, подібного до Go в Rust, але складність реалізації є певним випробуванням для програмістів.
——Дейв Чейні
безпека
Як згадувалося раніше, і Go, і Rust мають власні способи запобігання різним типовим помилкам програмування, особливо проблемам, пов’язаним із керуванням пам’яттю. Але **Rust йде далі, можна сказати, що він докладає всіх зусиль, щоб переконатися, що кожен не припустився неочікуваних помилок безпеки. **
Компілятор Rust настільки суворий, що перевіряє кожну змінну, яку ми використовуємо, кожну адресу пам’яті, на яку ми посилаємося. Це дозволяє уникнути потенційної гонки за даними, а також сповіщає вас про невизначену поведінку. У світі Rust майже неможливо виникнути проблеми з паралельністю та безпекою пам’яті.
— Чому варто вибрати Rust?
Тим не менш, досвід програмування в Rust відрізняється від практично будь-якої іншої мови, і може бути досить складним під час першого впровадження. Але в очах багатьох розробників ці зусилля однозначно варті грошей.
Для мене найбільшою перевагою Rust є те, що компілятор став моїм хорошим помічником, він не пропустить жодної виявленої помилки (серйозно, іноді це здається мені магією).
—Ґжегож Носек
Багато мов, включаючи Go, також надають інструменти, які допомагають програмістам уникнути помилок, але Rust виводить цей ефект на новий рівень. Багато некоректних програм взагалі не компілюються.
У Rust різноманітні засоби бібліотеки допомагають програмістам запобігати помилкам користувачів. Rust дозволяє нам указати частину даних, а потім гарантувати, що вони не належать і не змінюються чимось іншим. Я не можу згадати мову, яка надала стільки інструментів для запобігання випадковому неправильному використанню, і це чудово. — Сем Роуз
«Боротьба з шашкою позик» є обов’язковою для новачків Rust, але здебільшого шашка насправді не є ворогом. Проблеми, які він знаходить, справді є реальними помилками (або принаймні потенційними помилками) у коді. Це може змусити нас фундаментально змінити наші програми, щоб уникнути подібних проблем. Якщо ви справді ставите правильність і надійність своїм головним пріоритетом, то ця сувора вимога, очевидно, є хорошою.
З іншої точки зору, чи можна назвати новою мовою нову мову, яка не змінює метод програмування? А при використанні інших мов Rust вчить нас безпечно мислити, що не менш важливо.
Якщо люди вибирають Rust, це часто через гарантований дизайн, який він забезпечує: безпека щодо нульових покажчиків/перегонів даних, передбачувана поведінка під час виконання та повний контроль над обладнанням. Якщо для вас це не має сенсу, насправді немає потреби використовувати Rust. Зрештою, за ці переваги є ціна: важко почати. Ви повинні позбутися шкідливих звичок і опанувати нові поняття. На початку всіх закатує до смерті перевіряючий борг.
— Метью Ендлер
Справжня складність початку роботи з моделлю програмування Rust може залежати від того, якими іншими мовами ви користувалися раніше. Програмісти Python або Ruby можуть вважати Rust надто обмеженим, але інші можуть вважати ясність і недвозначні обмеження приємними.
Якщо ви програміст на C або C++ і тижнями шукали помилки безпеки пам’яті в мові, вам сподобається Rust. Тож «боротьба з перевіркою запозичень» перетворюється на «це все ще можливо з компілятором? Круто!»
— Гжегож Носек
Нарощувати
Сучасні серверні програми містять десятки мільйонів рядків коду, написаного сотнями програмістів, і оновлюються майже щодня. З точки зору дизайну та розробки Go повністю враховує необхідність підвищення ефективності роботи в такому середовищі. Розробка Go включає суворе керування залежностями, адаптивність архітектури програмного забезпечення в міру зростання системи та надійність між компонентами. — Роб Пайк
Коли ви вирішуєте проблему поодинці чи в невеликій команді, вибрати просту мову чи розширену мову залежить виключно від особистих уподобань. Однак із розширенням масштабу програмного забезпечення, складності та розширення команди відмінності між двома мовами почали справді проявлятися.
Для великих програм і розподілених систем швидкість виконання коду часто менш важлива, ніж швидкість розробки: така мова, як Go, яка навмисно наголошує на мінімальному дизайні, може скоротити час адаптації нових розробників і дозволити їм швидше брати участь Щоб зробити внесок у великі кодові бази.
Використовуючи мову GO, молодшим розробникам часто легше бути продуктивними, але розробникам середнього рівня важче вводити складні абстракції, що створює проблеми. Через цю характеристику Rust має тенденцію бути менш привабливим, ніж Go у світі розробки корпоративного програмного забезпечення.
— Лоріс Кро
Ясність і розбірливість завжди важливіші, ніж елегантність, коли йдеться про масштабну розробку програмного забезпечення. **Обмеження Go насправді роблять його більш адаптованим до потреб підприємств і великих організацій, ніж більш складні та потужні мови, такі як Rust. **
Rust проти Go: відмінності
Незважаючи на те, що Rust і Go є популярними та широко використовуваними сучасними мовами, вони насправді не є конкурентами, тому що вони націлені на абсолютно різні випадки використання**.
Весь підхід до програмування в Go повністю відрізняється від Rust, і ці функції особливо підходять для деяких людей, але, з іншого боку, можуть повністю дратувати інших. Це має сенс, тому що якщо Rust і Go вирішують однакові проблеми практично однаковими способами, навіщо нам дві окремі мови?
Отже, чи можемо ми почати з підходів Rust and Go і інтерпретувати їхню суть? Давайте разом спробуємо.
вивіз сміття
«Прибирати чи не прибирати сміття» – це завжди питання, на яке немає правильної відповіді. Загалом, збирання сміття та автоматичне керування пам’яттю можуть допомогти нам швидко й легко розробляти надійні й ефективні програми. Тому для деяких розробників це важливі функції.
Інші стверджують, що збирання сміття з його накладними витратами на продуктивність і глобальними паузами може призвести до непередбачуваної поведінки під час виконання та створити неприйнятну затримку. Звичайно, в цьому твердженні є правда.
Go та Rust — дві дуже різні мови. Хоча обидва можна просто описати як системну мову або заміну C, їхні цілі та сценарії застосування, стилі проектування мови та пріоритети функцій дійсно дуже різні. Прибирання сміття є головною відмінністю. Збирання сміття в Go робить мову простішою, меншою та зрозумілішою. Rust не має збирання сміття, що робить його надзвичайно швидким (це особливо підходить для розробників, які потребують не лише високої пропускної здатності, але й низької затримки), а також реалізує ряд функцій і шаблонів програмування, які Go взагалі не може зробити ( At принаймні без шкоди для продуктивності).
— PingCAP
близько до обладнання
Історію комп’ютерного програмування можна назвати дедалі складнішим процесом абстрактного розвитку. Це дозволяє програмістам вирішувати проблеми, не звертаючи зайвої уваги на те, як насправді працює базове обладнання. Цей дизайн робить програми легшими для написання та більш портативними. Але для інших програм важливіше доступ до апаратного забезпечення та точний контроль над тим, як програма виконується.
**Мета Rust — дозволити програмістам «наблизитися до апаратного забезпечення» та відновити більше контролю; тоді як Go абстрагується від архітектурних деталей, дозволяючи програмістам наблизитися до проблеми. **
Обидві мови мають різні сфери застосування. Go добре справляється з написанням мікросервісів і типових завдань «DevOps», але це не мова системного програмування. Rust сильніший у завданнях, які підкреслюють паралельність, безпеку та/або продуктивність, і має крутішу криву навчання, ніж Go.
— Метью Ендлер
Спочатку продуктивність
Фактично, для більшості програм продуктивність менш важлива, ніж читабельність коду. Але якщо в деяких проектах продуктивність справді ставиться на перше місце, у **Rust є багато компромісів у дизайні, які допоможуть максимально збільшити швидкість виконання вашого коду. **
На відміну від цього, Go більше дбає про простоту коду, і навіть готовий пожертвувати деякою продуктивністю під час виконання для цього. Але швидкість створення Go є неперевершеною, що часто навіть важливіше для великомасштабних кодових проектів.
Rust працює швидше, ніж Go. У бенчмарках Rust справді швидший, у деяких випадках на порядок. Але перш ніж вибрати Rust, поясніть: Go не відстає в більшості тестів і все ще зберігає перевагу в продуктивності над такими мовами, як Java, C#, Java і Python.
Якщо вам потрібна першокласна продуктивність, ви можете вибрати будь-яку з цих двох мов, і швидкість роботи ніколи не розчарує. Крім того, якщо ви створюєте веб-сервіс, який обробляє високоінтенсивні навантаження та потребує гнучкого вертикального/горизонтального масштабування, обидві мови також можуть задовольнити ваші потреби.
— Андрій Ладер
Правильність
З іншого боку, якщо ви не змусите програму ніколи не помилятися, компроміси будуть іншими. Більшість коду не розраховано на тривале використання, але деякі програми працюють у виробництві роками. З огляду на ці реалії, можливо, варто інвестувати трохи додаткового часу в розробку та забезпечення правильної та надійної роботи програми без важкого обслуговування в майбутньому.
І Go, і Rust допомагають вам писати правильні програми, але різними способами: **Go надає чудову вбудовану структуру тестування, а Rust зосереджується на усуненні помилок виконання за допомогою засобів перевірки запозичень. **
Моя думка така: для коду, який має бути випущений завтра, використовуйте Go; якщо це код, який має працювати стабільно протягом наступних п’яти років, тоді виберіть Rust.
— Гжегож Носек
Хоча і Go, і Rust достатньо хороші для серйозних проектів розробки, найкраще повністю зрозуміти їхні різноманітні функції та переваги. Коротше кажучи, неважливо, що думають інші: **Лише ви можете вирішити, яка мова програмування більше підходить для потреб вашої команди та проекту. **
Якщо ви хочете пришвидшити розробку, скажімо, у вас є багато різних сервісів для написання, або сама команда розробників велика, тоді мова Go, безперечно, є правильною відповіддю. Go приділяє особливу увагу дизайну для паралелізму та прагне виявити небезпечну поведінку доступу до пам’яті (як це робить Rust), але не змушує вас керувати кожною деталлю окремо.
Go швидкий і потужний, але за своєю суттю він допомагає розробникам відійти від шляху та зосередитися на простоті та єдності. З іншого боку, якщо вам потрібно втиснути кожну унцію запасу продуктивності, Rust ідеально підходить.
—Ендрю Ладер
Висновок Сподіваюся, ця стаття допоможе вам зрозуміти основні моменти Rust and Go. Якщо можливо, вам краще трохи випробувати ці дві мови, оскільки вони дуже корисні в будь-якому технічному плані, навіть для аматорів-ентузіастів програмування.
Але якщо ви витрачаєте час на серйозне вивчення лише однієї мови, будь ласка, переконайтесь у відповідних знаннях і нахилах Go and Rust, перш ніж зробити вибір.
Звичайно, знання мов програмування - це лише мала частина того, що робить успішного програміста. Окрім програмування, інженери мають володіти дизайном, інженерією, архітектурою, комунікацією та співпрацею. Поки кожен може добре робити наступні речі, незалежно від того, яку мову програмування ви виберете, ви станете чудовим майстром програмної інженерії.
Rust VS Go, яку мову слід вибрати розробникам у 2023 році?
Джерело: InfoQ
У 2023 році у нас буде тисяча причин вивчити Rust.
7 серпня фонд Rust Foundation опублікував результати звіту Rust Survey за 2022 рік. Звіт показує, що рівень впровадження Rust продовжує зростати. Більше 90% респондентів опитування вказали, що вони є користувачами Rust; Rust використовується для більшість роботи з кодування в , значне зростання на 51,8% порівняно з попереднім роком.
Немає сумніву, що Rust все більше привертає увагу розробників завдяки чудовій безпеці пам’яті та продуктивності паралелізму. Однак також важко ігнорувати Go, відносно «старого» гравця, який колись був обраний мовою програмування року.
Народжена в 2009 році мова Go привернула велику увагу завдяки унікальній моделі паралелізму та потужним перевагам продуктивності. Варто зазначити, що, як і мова Rust, творець мови Go також «ненавидить» C++, і Go також є домінуючою мовою хмарного нативу.
В опитуванні розробників Stack Overflow 2022 серед 70 000 відповідей на запитання «мова програмування, яка змушує людей любити та ненавидіти» програмісти, очевидно, віддають перевагу Rust, 86% із них сказали, що їм подобається Rust, а 64% сказали, що їм подобається Go. Зіткнувшись із гарячим статусом Rust, деякі розробники запитали себе: чи варто вивчати Go у 2023 році?
Крім того, за останні два дні питання про те, чи вибрати Rust чи Go, також стало гарячою темою на Hacker News:
Користувач мережі, який підтримує Rust, сказав: «Мене також турбував цей вибір протягом тривалого часу. Зрештою Rust переміг. По-перше, я відчуваю, що Rust ближче до речей попередньої ери Pascal, і ви можете контролювати все. ; по-друге, якщо wasm і пов’язані з ним технології є великим спалахом, Rust був би безпечнішим вибором; тоді ми вже маємо Python для швидкого розвитку, тому має сенс вибрати щось трохи екстремальніше, а Go є дещо посередині. Нарешті, Rust слід використовувати для Core і високого профілю, тому його навряд чи можна буде усунути».
Інший розробник, який не погоджувався, сказав: «Я займаюся розробкою в Go вже майже десять років, але нещодавно я також спробував Rust. Я думаю, що наразі є певні обов’язкові та оманливі переваги Rust, з мого досвіду в From, досвіду в різних стартапах, включаючи мій поточна, Go є, безумовно, найкращим вибором для бекенд-розробки! Зверніть увагу, продуктивність, функціональність чи щось інше... дві мови дуже, дуже схожі!»
Треба сказати, що і Go, і Rust є чудовими мовами програмування. Вони сучасні, потужні, універсальні та забезпечують чудову продуктивність. Але насправді немає сенсу прямо порівнювати Go та Rust, хто з них кращий, оскільки кожна мова програмування являє собою серію глибоких компромісів, що стоять за нею. Різні мови будуть оптимізовані для різних потреб, тому, коли ми вибираємо мову, ми також повинні враховувати, для вирішення яких проблем ми хочемо її використовувати. Отже, ми почнемо з застосовних сценаріїв мов Go і Rust і обговоримо «шлях» дизайну Go і Rust.
Хоча Rust і Go сильно відрізняються за синтаксисом і стилем, обидва є першокласними інструментами для створення програмного забезпечення. Давайте почнемо конкретний аналіз нижче.
Go vs. Rust: Подібності
Rust і Go мають багато спільного, тому люди часто порівнюють їх. Які у них спільні цілі?
і:
Безпека пам'яті
І Go, і Rust належать до сучасних мов програмування, які приділяють особливу увагу безпеці пам’яті. За десятиліття розробки старих мов, таких як C і C++, стало зрозуміло, що однією з основних причин помилок і помилок є небезпечний/некоректний доступ до пам’яті.
Отже, Rust і Go надали різні рішення, але мета обох — бути розумнішими та безпечнішими з точки зору керування пам’яттю, а також допомогти розробникам писати правильні програми з чудовою продуктивністю.
Швидкий, компактний виконуваний файл
Обидві є скомпільованими мовами, що означає, що програми можуть бути переведені безпосередньо у виконуваний машинний код, так що програми можуть бути розгорнуті як один бінарний файл. На відміну від інтерпретованих мов, таких як Python і Ruby, нам не потрібно додавати інтерпретатор і багато бібліотек/залежностей разом із програмою. Як пряме відображення цієї основної переваги, програми Rust and Go працюють швидше, ніж інтерпретовані мови.
Мова загального призначення
І Rust, і Go — це потужні та розширювані мови програмування загального призначення, які можна використовувати для розробки будь-якого сучасного програмного забезпечення — від веб-додатків до розподілених мікросервісів, вбудованих мікроконтролерів, мобільних додатків тощо. **Обидва мають чудові стандартні бібліотеки та процвітаючі екосистеми сторонніх розробників, а також потужну комерційну підтримку та велику базу користувачів. **Обидва існують протягом багатьох років і продовжуватимуть процвітати в наступні роки. Сьогодні вивчення Go або Rust було б розумною інвестицією часу та енергії.
Прагматичний стиль програмування
Вони також не є занадто функціональними мовами (наприклад, Scala або Elixir), а також не повністю об'єктно-орієнтованими (наприклад, Java і C#). Навпаки, хоча і Go, і Rust мають функції функціонального та об’єктно-орієнтованого програмування, вони завжди наголошують на прагматичній орієнтації, тобто вирішують проблему найбільш прийнятним способом, а не змушують усіх використовувати специфічний метод через «ідеологію».спосіб робити речі. **Але якщо вам справді подобається функціональний стиль програмування, на стороні Rust є більше пов’язаних інструментів, що є однією з переваг Rust над Go. **
Великий розвиток
І Rust, і Go надають багато корисних функцій для широкомасштабного програмування, тож обидва вони можуть адаптуватися до реальних потреб великих команд розробників і великих кодових баз. **Наприклад, програмісти на C роками сперечалися про те, куди вставляти дужки та чи слід робити відступи в коді табуляціями чи пробілами; але Rust і Go вже використовують стандартні засоби форматування (Go має gofmt, Rust це rustfmt) повністю вирішують ці проблеми. проблеми. Вони автоматично переписують ваш код, використовуючи відповідний стиль.
Справа не в тому, що цей конкретний формат є тонким, але **програмісти Rust and Go є більш прагматичними і радше оберуть єдиний стандарт реалізації. **
Ще одна велика перевага цих двох мов відображена в конвеєрі збірки. Обидва мають чудові, вбудовані та ефективні стандартні інструменти збірки та керування залежностями. Це означає, що програмістам не потрібно боротися зі складними сторонніми системами збирання, а також їм не потрібно вивчати нову систему кожні кілька років.
**Іржавіти чи піти? **
Після такої кількості розмов про те, що обидві мови настільки добре розроблені та потужні, чи є якийсь результат у цьому конкурсі? Або, оскільки обидва є чудовими варіантами, чому люди досі обурюються в соціальних мережах, пишуть довгі коментарі в блогах, кажучи, що «Rust — це для ідіотів» або «Go — це зовсім не мова програмування». Різкі слова?
Звичайно, декому просто хочеться виплеснути емоції, але це явно не допомагає вирішити справжню проблему. Принаймні, коли йдеться про те, яку мову використовувати в проекті чи яку мову використовувати для проникнення у світ програмування, гучні голоси явно не допоможуть зробити правильний вибір.
Давайте повернемося до обговорення дорослих і подивимося, які сильні та слабкі сторони Rust і Go мають за раціонального аналізу.
Go проти Rust: продуктивність
Як згадувалося раніше, програми, згенеровані Go та Rust, обидві швидкі, оскільки вони компілюються до рідного машинного коду без використання інтерпретатора чи віртуальної машини. Але продуктивність Rust все ще краща, навіть порівнянна з C і C++, які відомі як галузеві еталони продуктивності. І на відміну від цих старомодних мов, Rust також забезпечує захист пам’яті та механізми безпеки паралелізму, майже не впливаючи на швидкість виконання. Rust також дозволяє розробникам створювати складні абстракції без зниження продуктивності під час виконання.
Навпаки, Хоча продуктивність програм Go також хороша, у дизайні головним чином зосереджена швидкість розробки (включаючи компіляцію), а не ступінь виконання. Програмісти Go віддають перевагу чіткому та читабельному коду, тому швидкість роботи трохи нижча.
Компілятор Go також не витрачає багато часу на створення найефективнішого машинного коду, він більше стурбований швидким компілюванням великої кількості коду. **Тож у тестах виконання програми Rust часто переважає програму Go. **
Продуктивність Rust під час виконання також є дуже стабільною та передбачуваною, оскільки він не використовує збирання сміття. Збирач сміття Go дуже ефективний і оптимізований, щоб час паузи був якомога коротшим (час паузи скорочується з кожним випуском Go). Але в будь-якому разі збирання сміття завжди вносить деяку непередбачуваність у поведінку програми, і це може бути серйозним або навіть абсолютно неприйнятним для певних програм (таких як вбудовані системи).
Оскільки мета Rust — надати програмісту повний контроль над апаратним забезпеченням, що лежить в основі, **програми Rust можна глибоко оптимізувати для наближення до максимальної теоретичної продуктивності машини. **Це робить Rust найкращим вибором для певних випадків використання, де швидкість виконання перевершує все інше, наприклад програмування ігор, ядра операційної системи, компоненти веб-браузера та системи керування в реальному часі.
Немає значення, наскільки потужною є мова програмування, якщо її надто складно вивчити й вона не дає змоги більшості людей. Go, здається, навмисно розроблений, щоб відрізнятися від мов дедалі більшої складності, таких як C++: **У нього дуже мало синтаксису, дуже мало ключових слів і навіть не так багато функцій. **
Це означає, що мову Go легко вивчити, і ви можете писати на ній різні програми після невеликого розуміння.
Ключовим тут є "простота" три слова. Звичайно, просто не означає легко. Але маленьку і просту мову, безумовно, легше вивчити, ніж велику і складну мову. Існує не так багато способів досягнення одного ефекту, тому високоякісний код Go майже завжди виглядає однаково. Це має ще одну перевагу: ми можемо швидко зрозуміти, що робить служба, з якою ми не знайомі.
**Основна онтологія Go невелика, але стандартна бібліотека дуже потужна. **Тобто, окрім синтаксису Go, наша крива навчання також має враховувати цю частину стандартної бібліотеки.
З іншого боку, перенесення функцій з мови на стандартну бібліотеку означає, що кожному потрібно лише зосередитися на вивченні бібліотек, пов’язаних із поточними потребами розробки. **Go також розроблено з повним урахуванням потреб великомасштабної розробки програмного забезпечення та може підтримувати великі кодові бази та групи розробників. **У цьому типі сценарію нові розробники повинні мати можливість швидко розпочати роботу. З цією метою спільнота Go завжди віддавала пріоритет простоті, зрозумілості, універсальності та прямоті програм.
**Rust спеціально розроблено для включення різноманітних потужних і корисних функцій, які допомагають програмістам робити більше з меншим кодом. **Наприклад, функція відповідності Rust дає змогу швидко писати гнучку та виразну логіку:
Але також через те, що Rust має багато конструктивних міркувань, його складніше вивчити, особливо на початковому етапі. Але це гаразд, зрештою, C++ або Java є чому навчитися, і вони навіть не пропонують розширені функції Rust, такі як безпека пам’яті. Отже, дійсно нерозумно критикувати надто складний звук Rust: він розроблений, щоб підкреслити експресію та багаті функції, ми не можемо очікувати, що він буде таким простим і чистим, використовуючи всі переваги. Тож, звичайно, Rust має власну криву навчання. Але допоки ця складність буде подолана, попереду буде гладка дорога.
**Незважаючи на те, що Rust і Go запозичують деякі функції один у одного (наприклад, загальні), можна сказати, що функції Rust все ще кращі, а функцій Go відносно бракує. **
Більшість мов надають певну підтримку паралельного програмування (тобто виконання кількох операцій одночасно), але Go розроблено для цього з нуля. **Go не використовує потоки операційної системи, але пропонує легку альтернативу: goroutines. **Кожна підпрограма go — це функція Go, що виконується незалежно, і яку планувальник Go відображає одному з потоків операційної системи під керуванням. Тобто планувальник може дуже ефективно керувати великою кількістю одночасних підпрограмм, використовуючи лише обмежену кількість потоків операційної системи.
Таким чином, ми можемо запускати мільйони одночасних goroutines в одній програмі, не турбуючись про серйозні проблеми з продуктивністю. Через це **Go є повним рішенням для сценаріїв великомасштабних одночасних програм, таких як веб-сервери та мікросервіси. **
Go також надає канали для goroutines, що є швидким, безпечним і ефективним способом спілкування та обміну даними. Рівень паралелізму Go справді дуже високий, а досвід використання досить спокійний і приємний.
Загалом розробка паралельних програм є дуже складною, а створення надійних і правильних паралельних програм будь-якою мовою аж ніяк непросте. Однак, оскільки ця вимога була врахована на початку проекту, механізм паралельного програмування в Go був максимально простим і добре інтегрованим.
Навпаки, механізм паралелізму в Rust щойно приземлився і ще не стабілізувався, тож усі можуть продовжувати приділяти увагу цьому активному напрямку розвитку. Це також корисно. Наприклад, бібліотека районів Rust надає дуже елегантний і легкий метод, який може перетворювати послідовні обчислення в паралельні обчислення.
Хоча це може бути непросто реалізувати паралельні програми в Rust, це все одно цілком можливо, і** ці програми також отримують користь від ретельно розроблених гарантій безпеки пам’яті Rust. **Візьмемо для прикладу клас Mutex стандартної бібліотеки: у Go ми можемо забути отримати м’ютекс перед доступом до чогось; але в Rust про це взагалі не потрібно турбуватися.
Як згадувалося раніше, і Go, і Rust мають власні способи запобігання різним типовим помилкам програмування, особливо проблемам, пов’язаним із керуванням пам’яттю. Але **Rust йде далі, можна сказати, що він докладає всіх зусиль, щоб переконатися, що кожен не припустився неочікуваних помилок безпеки. **
Тим не менш, досвід програмування в Rust відрізняється від практично будь-якої іншої мови, і може бути досить складним під час першого впровадження. Але в очах багатьох розробників ці зусилля однозначно варті грошей.
Багато мов, включаючи Go, також надають інструменти, які допомагають програмістам уникнути помилок, але Rust виводить цей ефект на новий рівень. Багато некоректних програм взагалі не компілюються.
«Боротьба з шашкою позик» є обов’язковою для новачків Rust, але здебільшого шашка насправді не є ворогом. Проблеми, які він знаходить, справді є реальними помилками (або принаймні потенційними помилками) у коді. Це може змусити нас фундаментально змінити наші програми, щоб уникнути подібних проблем. Якщо ви справді ставите правильність і надійність своїм головним пріоритетом, то ця сувора вимога, очевидно, є хорошою.
З іншої точки зору, чи можна назвати новою мовою нову мову, яка не змінює метод програмування? А при використанні інших мов Rust вчить нас безпечно мислити, що не менш важливо.
Справжня складність початку роботи з моделлю програмування Rust може залежати від того, якими іншими мовами ви користувалися раніше. Програмісти Python або Ruby можуть вважати Rust надто обмеженим, але інші можуть вважати ясність і недвозначні обмеження приємними.
Коли ви вирішуєте проблему поодинці чи в невеликій команді, вибрати просту мову чи розширену мову залежить виключно від особистих уподобань. Однак із розширенням масштабу програмного забезпечення, складності та розширення команди відмінності між двома мовами почали справді проявлятися.
Для великих програм і розподілених систем швидкість виконання коду часто менш важлива, ніж швидкість розробки: така мова, як Go, яка навмисно наголошує на мінімальному дизайні, може скоротити час адаптації нових розробників і дозволити їм швидше брати участь Щоб зробити внесок у великі кодові бази.
Ясність і розбірливість завжди важливіші, ніж елегантність, коли йдеться про масштабну розробку програмного забезпечення. **Обмеження Go насправді роблять його більш адаптованим до потреб підприємств і великих організацій, ніж більш складні та потужні мови, такі як Rust. **
Rust проти Go: відмінності
Незважаючи на те, що Rust і Go є популярними та широко використовуваними сучасними мовами, вони насправді не є конкурентами, тому що вони націлені на абсолютно різні випадки використання**.
Весь підхід до програмування в Go повністю відрізняється від Rust, і ці функції особливо підходять для деяких людей, але, з іншого боку, можуть повністю дратувати інших. Це має сенс, тому що якщо Rust і Go вирішують однакові проблеми практично однаковими способами, навіщо нам дві окремі мови?
Отже, чи можемо ми почати з підходів Rust and Go і інтерпретувати їхню суть? Давайте разом спробуємо.
«Прибирати чи не прибирати сміття» – це завжди питання, на яке немає правильної відповіді. Загалом, збирання сміття та автоматичне керування пам’яттю можуть допомогти нам швидко й легко розробляти надійні й ефективні програми. Тому для деяких розробників це важливі функції.
Інші стверджують, що збирання сміття з його накладними витратами на продуктивність і глобальними паузами може призвести до непередбачуваної поведінки під час виконання та створити неприйнятну затримку. Звичайно, в цьому твердженні є правда.
Історію комп’ютерного програмування можна назвати дедалі складнішим процесом абстрактного розвитку. Це дозволяє програмістам вирішувати проблеми, не звертаючи зайвої уваги на те, як насправді працює базове обладнання. Цей дизайн робить програми легшими для написання та більш портативними. Але для інших програм важливіше доступ до апаратного забезпечення та точний контроль над тим, як програма виконується.
**Мета Rust — дозволити програмістам «наблизитися до апаратного забезпечення» та відновити більше контролю; тоді як Go абстрагується від архітектурних деталей, дозволяючи програмістам наблизитися до проблеми. **
Фактично, для більшості програм продуктивність менш важлива, ніж читабельність коду. Але якщо в деяких проектах продуктивність справді ставиться на перше місце, у **Rust є багато компромісів у дизайні, які допоможуть максимально збільшити швидкість виконання вашого коду. **
На відміну від цього, Go більше дбає про простоту коду, і навіть готовий пожертвувати деякою продуктивністю під час виконання для цього. Але швидкість створення Go є неперевершеною, що часто навіть важливіше для великомасштабних кодових проектів.
З іншого боку, якщо ви не змусите програму ніколи не помилятися, компроміси будуть іншими. Більшість коду не розраховано на тривале використання, але деякі програми працюють у виробництві роками. З огляду на ці реалії, можливо, варто інвестувати трохи додаткового часу в розробку та забезпечення правильної та надійної роботи програми без важкого обслуговування в майбутньому.
І Go, і Rust допомагають вам писати правильні програми, але різними способами: **Go надає чудову вбудовану структуру тестування, а Rust зосереджується на усуненні помилок виконання за допомогою засобів перевірки запозичень. **
Хоча і Go, і Rust достатньо хороші для серйозних проектів розробки, найкраще повністю зрозуміти їхні різноманітні функції та переваги. Коротше кажучи, неважливо, що думають інші: **Лише ви можете вирішити, яка мова програмування більше підходить для потреб вашої команди та проекту. **
Висновок Сподіваюся, ця стаття допоможе вам зрозуміти основні моменти Rust and Go. Якщо можливо, вам краще трохи випробувати ці дві мови, оскільки вони дуже корисні в будь-якому технічному плані, навіть для аматорів-ентузіастів програмування.
Але якщо ви витрачаєте час на серйозне вивчення лише однієї мови, будь ласка, переконайтесь у відповідних знаннях і нахилах Go and Rust, перш ніж зробити вибір.
Звичайно, знання мов програмування - це лише мала частина того, що робить успішного програміста. Окрім програмування, інженери мають володіти дизайном, інженерією, архітектурою, комунікацією та співпрацею. Поки кожен може добре робити наступні речі, незалежно від того, яку мову програмування ви виберете, ви станете чудовим майстром програмної інженерії.