На момент конца 2022 года наблюдается кризис в IT-индустрии, когда по мнению многих компаний большое количество программистов неэффективно справляются с поставленной задачей, и многих из них можно уволить без серьёзного ущерба для деятельности компании. Главной причиной была экономическая неэффективность многих технологий, которые, по факту, не облегчали разработку готового коммерческого продукта, приносящего доход, а лишь усложняли её, делая неоправданно дорогой и более сложной. Сокращения в основном коснулись junior-специалистов, владеющих небольшим количеством технологий на не слишком высоком уровне. В связи с этим многие из них стали задумываться о смене направления, изучении каких-то новых технологий. Одна из них — язык программирования Rust.
Язык программирования Rust появился в публичном релизе незадолго до этого события, хотя разрабатывался в состоянии предрелиза несколько лет. Это далеко не успешный коммерческий продукт. Своему создателю Грейдону Хоару язык Раст не принёс многомиллиардного состояния, сообществу Mozilla Foundation, где он долгое время развивался до своего официального релиза, он тоже не принёс каких-то доходов, кроме положительной репутации. На сегодняшний день он не является каким-то продуктом популярной разработки, приносящим доход своим создателям по типу C# и ряда других. Тем не менее, сам Rust является перспективной технологией будущего.
Доказательства того, что у языка Rust есть будущее
Итак, что же такое Rust, очередная пустышка, которая окажется всеми забыта, или же золотое семечко, из которого потом можно будет вырастить огромное дерево? Попробуем разобраться, почему же Rust всё-таки оправдает надежду тех, кто его планирует изучать, готов потратить на это и время, и силы.
Во-первых, это мнение авторитетных специалистов. Большинство профессиональных разработчиков в крупных компаниях говорят, что Rust способен на многое. И у него большие перспективы. Например, Линус Торвальдс, который достаточно консервативно относится ко всему новому в ядре Linux, согласился внедрить в него часть кода, написанного на Rust. Критика этого языка, как правило, субъективна и исходит в основном от C/C++ разработчиков, которые видят в нём конкурента для своей коммерческой ниши.
Во-вторых, деньги, которые платят за разработку на Rust. В мире существует большое количество языков программирования, в том числе новых, в том числе сложных (об этом далее), в том числе таких, где общий уровень среднего специалиста высок (об этом тоже далее). Но почему-то именно Rust-разработчиков менеджеры и директора хотят видеть в числе сотрудников своих компаний и именно для них они готовы выделять наибольший бюджет.
В третьих, это ниша, которая занимается этим языком. Не секрет, что языки C и C++, на которых принято писать самые высоконагруженные части программного обеспечения, а также операционные системы, несколько устарели. С появился в 1972 году, «плюсики» на десять лет позже. Понятное дело, что они развивались все эти годы, накопилось огромное количество библиотек к ним.
Несмотря на это они являются устаревшими. Современные стандарты программирования предполагают использование технологий, которые позволяют создавать программы быстро. Указатели, работа с памятью, многопоточность — все эти вещи не слишком просто реализуемы в рамках большой команды разработчиков на языке «Си», когда они все работают над одним общим кодом. Скорость разработки программы будет снижаться.
Второй момент — это то, что современное «железо» требует работы с многопоточностью. Прежде всего это касается встроенной многозадачности для машин, собранных на базе 64-битных процессоров. Старые программы на C++ никак не решают эту задачу, использование ресурсов системы.
Всё острее ощущается необходимость заполнения этой ниши чем-то ещё, кроме C и C++, так как потребность в средствах разработки, эффективно управляющих «железом» есть и большая. Некоторые даже предлагали воскресить давно забытые технологии, типа Паскаля. И тут на помощь приходит Rust.
Недостатки языка Rust
Прежде всего стоит отметить сложность изучения. Очень грубо и приблизительно её можно оценить по количеству зарезервированных слов. Например, тот же Паскаль в своей последней редакции имеет их всего около двадцати штук — двадцать слов и вы уже знаете в общих чертах язык. То же самое можно сказать и о Lua — функциональном скриптовом языке, который изначально и разрабатывался как язык для простых сценариев. Меньше только у Scheme, изначально создававшемся как язык прототипирования, но тут сложность в другом. Более сложные языки, Javascript, Python, PHP, имеют в составе уже около 40-50 слов, в два раза больше.
Языки C и C++, например, в составе имеют более 80 слов и официально считаются одними из самых сложных. Сколько же слов в языке Rust? Язык считается развивающимся, точное их количество будет уточняться, но в нынешней версии 1.66.0 на начало 2023 года их чуть меньше 100. В этом плане он соперничает только, разве что, с языком Common Lisp, который старше языка C, сложнее его и впитал в себя больше дополнений.
Сходство с Lisp у Rust ещё и в том, что оба используют определённый подход к программированию, непривычный для большинства современных программистов. Например, Scheme, который является очень сильно упрощённым диалектом Lisp-1, не получил большого распространения именно по этой причине, а вовсе из-за неудобства отладки с большим количеством скобок, как указывают некоторые. Эта проблема легко решается правильным форматированием кода, соблюдением принципа «как можно больше скобочек вместе».
Rust считается мультипарадигменным, однако для него можно выделить одну общую особенность, касающуюся не математического принципа в программировании как парадигму, а общий подход к работе программиста. Даже для простых программ, типа вычисления факториала, может потребоваться знание трейтов, крейтов, владения, срезов и других специфических вещей.
Например, чтобы написать такую же программу на C++, скорее всего, не нужны будут ни познания в ООП, ни работа с указателями, ни многопоточность. При этом программист вполне способен решить задачи для не слишком замысловатого собеседования правильно и устроиться на работу. А когда наступает пора реальной работы над проектом в команде, тут оказывается, что он по факту ничего не может. В Rust данный вопрос решается сразу, даже для написания программ небольшого объёма с базовой функциональностью, вроде хранителя экрана SolarWind, знать и уметь нужно много. На сегодня это один из самых сложных использующихся языков программирования.
Второй его минус следует из первого. Он совершенно не подходит для того, чтобы «быстренько что-то написать и проверить». Его нельзя использовать для построения какой-то бизнес-модели, какой-то имитации логики. Любая программа при разработке на нём требует серьёзного подхода, хорошего тестирования и отладки. Да, для Data Science лучше подойдёт другой язык, скриптовый, а не системный. Всё-таки Rust это язык в основном для системного программирования, как и Си.
И плюсом, и минусом будет то, что это сравнительно молодой язык. Он будет изменяться, развиваться, чтобы писать на нём программы нужно будет постоянно учиться. Не факт, что он в дальнейшем сохранит совместимость с предыдущими версиями. Так, например, произошло с Perl, который никак не может из-за этого перейти с 5.x на 7.0, а язык Raku, базирующийся на perl, по факту считается другим языком. Однако стоит учесть, что до своего официального выхода Rust развивался более 8 лет, а Perl — менее года. Поэтому появление проблем в дальнейшем менее вероятно. Что, однако, не избавляет от необходимости постоянного обучения ввиду изменяющихся стандартов.
Наконец, последний минус — это относительно слабо реализованные механизмы объектно-ориентированного программирования. Многие, кто на это делал основной упор при написании программ, могут разочароваться. Привет программистам на Ruby. Изучать новый язык для тех, кто привык писать в объектно-ориентированной парадигме будет даже сложнее, чем новичкам, освоившим базовый курс PHP. Всё связано с тем, что ООП, а особенно наследование и полиморфизм, в Rust связаны с многочисленными управляющими конструкциями, трейтами, всё это должно управляться при помощи области видимости и владения и не нарушать их. Нельзя сказать, чтобы ООП совсем невозможно было реализовать. Но оно реализовано несколько однобоко, наподобие ООП в Javascript.
Плюсы языка программирования Rust
Если вы готовы преодолеть сложность языка и изучение новых подходов к управлению программой (не к парадигмам программирования, а именно к управлению), то вашему вниманию предлагается множество плюсов этого языка.
Первый плюс — это то, что предоставляется возможность безопасного и надёжного управления памятью. Это главная «фишка», благодаря которой он имеет свои перспективы. Концепция владения, которой нет ни в одном широко известном языке программирования, является новой и очень перспективной. Там она хорошо проработана, в том числе и на низком уровне. Как известно, именно из-за сложности управления памятью связаны 90% всех ошибок в программах на C++. Нельзя сказать, что здесь это намного проще — но точно надёжнее.
Второй плюс — это встроенная многопоточность и паралеллизм. Сложные приложения, большой вычислительный объём, обработка многих запросов — всё это не требует установки дополнительных библиотек и идёт «из коробки». Во многом именно для этих целей язык и был создан.
Третий плюс — это возможность реализовывать библиотеки на основе других языков программирования в виде модулей, крейтов. В том числе и тех, которые были написаны на C/C++ и предназначались для тех же целей, что и Rust. Также в наличии есть большое количество собственных библиотек, которые создавались с момента появления его в 2006 году.
Наконец, четвёртый плюс — это возможность реализовывать даже те концепции, которые могут являться с точки зрения компилятора «небезопасными». Для этого достаточно указать атрибут «unsafe» или же отключить обработку ошибок компилятором. Например, когда хочется реализовать с минимумом кода сложное наследование, используя конструкции, похожие на язык «Си».
Последний плюс — богатые возможности для написания программ в функциональном стиле. Rust — мультипарадигменный язык. Функциональные возможности в нём гораздо шире, чем в C++, хотя, конечно, уступают тому же Лиспу.
Rust и Golang. Программирование для Web.
Небольшое лирическое отступление по поводу другого языка, Golang. Или попросту Go. Некоторые почему-то считают, что они предназначены для одних и тех же целей и занимают одну и ту же нишу, могут конкурировать в какой-то обласи. Это не так.
Во-первых, Golang предъявляет немного другие требования к разработчикам. Он, в отличие от Rust, не является таким сложным языком программирования в обучении, следовательно, программистом на нём, в отличие от Rust, может стать большее количество людей, это язык для потенциальных джунов.
Во-вторых, это язык со сборкой мусора и динамической типизацией. Ни о каком ручном, высокоэффективном управлении памятью речь не идёт. Всё спрятано «под капот» с целью, чтобы облегчить написание программ.
Сходства между ними это:
1. То, что Rust, благодаря библиотеке Tokyo и Web-assm, помогает создавать динамические веб-приложения, для этого предназначен и Golang.
2. И в том, и в другом языках есть возможность распараллеливания вычислений, правда, в Rust работа с ресурсами системы при этом происходит более точно. Распределённая работа клиент-серверного приложения будет реализована эффективнее, но сложнее.
3. И тот, и другой язык являются компилируемыми, то есть ни JIT-кода, ни каких-то LLVM-файлов не будет создаваться. Работа будет происходить именно на уровне процессора в обоих языках.
По поводу Rust однозначно можно сказать, что основное его предназначение — не прикладное и не веб-программирование, а именно системное. Сетевым оно стало лишь благодаря тому, что «система» в нынешнем понимании часто существует не в привязке к какой-то машине или серверу, а к целой группе участников, связанных сетью и работающими с облаком данных. Здесь как нельзя лучше проявляется его управление памятью, когда исключаются ошибки доступа к ней в сети и общая работоспособность ускоряется.
Тем не менее, положительный опыт создания веб-серверов, веб-приложений, библиотек на Rust есть. Но всё-таки какие-то небольшие приложения удобнее писать на Go.
Rust и C
Возникает вопрос, если такие преимущества у Rust перед C, не означает ли это, что последний в скором времени прекратит своё существование. Конечно же нет. Несмотря на возможность работы с микроконтроллерами в embedded-устройствах, Rust в этом плане сильно уступает языку C в плане компактности скомпилированного кода. Достаточно большой общий объём памяти, занимаемый при обработке в современных компиляторах, делает неудобным, например, написание демона для отслеживания поведения системы устройства при очень ограниченных ресурсах. С++ при этом имеет более богатые возможности для объектов. Наличие огромного количества уже написанных библиотек на «Си» и «плюсиках» не оставит без работы их программистов.
Есть ещё один аспект использования Rust и C: во вредоносных программах. Если первый исключает обращение по «запрещённым» адресам памяти, то второй допускает это. А при написании вредоносного кода как раз оно и требуется! Тут специально «стреляют в ногу», чтобы в суматохе забрать кошелёк. Поэтому, учитывая то, что программа, скомпилированная на C, может быть в итоге супер компактной и работает именно так, как требует злоумышленник, можно считать, что для злостных хакеров С и C++ в плане изучения будут всё-таки более рациональными вариантами. Знание C++ всегда будет полезно и для Rust-программиста, так как позволяет лучше использовать крейты с использованием кода на этих языках. Да, это в определённой степени конкуренты, но один не исключает другого. Работы хватит всем.
Выводы
Самый главный вопрос любого, кто захотел прочитать данную статью, заключается в том, стоит ли изучать новый язык программирования Rust тем, кто хочет начать или только начинает свой путь в IT в 2023 году. Всем подряд точно не стоит и зависит только от того, в какой области хочется развиваться. Если в области системного программирования в той или иной его форме — то да, было бы очень неплохо. Если в области финансовой аналитики, проектов с минимально необходимой жизненной способностью, решении специфических инженерных задач, например, по САПР или символьным вычислениям, генетическому программированию и т. д. вряд ли это будет полезно. Лучше изучить другой язык, более простой, например, Python.
Второй вопрос, который всех волнует — это деньги. В настоящий момент этот язык программирования один из самых высокооплачиваемых. Стоит ли заниматься им ради получения какого-то дохода? В первую очередь надо помнить, что программирование — это далеко не стабильный пассивный доход, это длительный и тяжёлый труд. Зачастую не самый благодарный. Тем, кто хочет больше денег, стоит взглянуть в сферу бизнеса или торговли, трейдинга, инвестиций. А там, если посмотреть на то, что используется, «рулят» скриптовые и полускриптовые языки. Тот же Python и Lua будут предпочтительнее, можно изучить язык R, и абсолютно всегда полезным будет знание SQL и английского.
Наконец, вот ответ на вопрос, смогу ли я получить стабильную оплачиваемую работу в серьёзной коммерческой фирме, если у меня будут знания и опыт по Rust. В определённой степени да, это можно будет сделать. Но если речь идёт о банках, то наибольшее количество вакансий тут создаётся на языке Java. Перехода на Rust совершенно точно не будет по вполне понятным причинам, это очень консервативные структуры, которые со скрипом меняют свои приоритеты в технологиях. Пример — язык COBOL, страшный динозавр, который до сих пор (!) более полувека используется в банковской сфере.
По поводу ещё одной области, GameDev, то здесь у Rust есть все возможности занять хорошую нишу. Уже имеется игровой движок на Rust, правда, об играх, созданных на нём, пока ничего не известно. По аналогии с C++, в программировании игр подобные языки, как Rust, применяются успешно.
Несмотря на все свои преимущества, у Rust есть высокий порог вхождения. Потребуется знание общих принципов программирования. Ни один популярный учебник по Rust не объясняет, что такое инкапсуляция, замыкания или полиморфизм — предполагается, что пользователь уже это знает. Лучше всего приступать к изучению этого инструмента, освоив любой другой язык — например, тот же C++.