Привет, коллеги.
На самом деле ещё несколько месяцев назад я ненавидел Rust и задавался лишь одним вопросом: какого чёрта я вообще с ним связался? Но сегодня - сегодня всё иначе. И про это я хочу предложить немного доводов разобрать с ним.
Он быстрый. Конечно не в смысле разработки и отладки (особенно поначалу), а в плане работы. Код, написанный на нём, в некоторых вопросах существенно быстрее аналогичного кода, написанного на других языках программирования. Нисколько не хочу обидеть адептов других религий языковых предпочтений (уверен, вы с лёгкостью докажете, что это не так). Однако предложенные мне тесты показали, что он немного, но шустрее.
Он безопасный. Это, правда, не совсем так, но если взять условного новичка, который напишет программу на C и условного новичка, который напишет программу на Rust - шанс, что вторая выйдет более безопасной окажется существенно выше. По крайней мере, атака через переполнение буфера, почти гарантировано, провалится (не станем отрицать наличие дарований, которые даже там, где это почти невозможно, смогут заложить уязвимость).
Он необычный. Уверен, вы сталкивались со странными языками программирования. Такими, которые ломают привычную парадигму и заставляют мыслить иначе. Например, люди, всю жизнь работающие с объектно-ориентированным подходом, нередко, теряются, когда сталкиваются с функциональным программированием, т.к. там иной подход. Да даже далеко ходить не надо; столкновение с попыткой воспользоваться OpenGL из привычного C++, в какой-то момент, рвёт все шаблоны и в воздухе повисает лишь два вопроса: "какого..." и "зачем вы так со мной". Это, разумеется, проходит, но не сразу.
Простите, отвлёкся. Так вот, Rust заставит вас взглянуть на программирование по-другому, то есть совсем иначе. Он заставит вас писать код так, как вы до него не писали, потому что все старые парадигмы просто не работают. "Хотите отправить структуру в функцию, а потом ещё поработать с ней? Только не в мою смену!". Это существенно развивает воображение.
От отлично документирован. Нет, я несправедлив к Rust. Он великолепно документирован. Почти про любой аспект работы с ним вы найдёте отдельную книгу, где вам от "а" до "я" всё разжуют. Но, вполне вероятно, вы всё равно не поймёте, т.к. чтобы понять это, неплохо бы прочитать ещё несколько книг, где разжёвывается что-то ещё. Зато через несколько месяцев мозг вырастет на размер, а то и на все два!
Он неисчерпаем. Да, порой мне именно так и кажется. Есть множество способов сделать то, что я только что сделал, только по-другому; есть своя std библиотека и я не могу даже представить, чего в ней нет, потому что создаётся ощущение, что в ней есть чуть менее, чем всё.
Он дружелюбен. Компилятор всегда подскажет, где вы ошиблись и даже предложит решение, как сделать так, чтобы проблему исправить, а также добавит ссылку на справку. И иногда его рекомендация даже сработает. Но в целом, журнал из 30 ошибок на 3 строчки кода, в какой-то момент, уже перестаёт пугать и даже удивлять.
Он поддерживается и развивается. У него "из коробки" есть свой собственный менеджер пакетов (вроде npm или pip), а также реестр самих пакетов. Из недостатков - не всегда можно получить исходники устанавливаемого пакета или библиотеки (поправьте, если это не так).
Его можно использовать для web. Через webassembly. Именно по этой причине, собственно, я с ним и связался. Пробовал делать эмуляции роста плесени, а последнее - пробовал на нём реализовать параллакс эффект на веб-странице не прибегая к js (если интересно, про это можно почитать тут). wasm-pack позволяет собирать webassembly пакеты и встраивать в своё приложение. Ещё можно делать и при помощи ecmascripten для C++, но, почему-то, C++ не так интересен для меня.
Он заставляет учиться. Для начала, вы будете вынуждены разобраться, как устроена память приложения, как примерно работают компиляторы и что происходит "под капотом", когда исходный код превращается в бинарник (конечно, если ещё не знали этого). Не то, чтобы это сильно поможет вам в написании этого самого кода, но некоторые вещи следует знать просто ради того, чтобы воспользоваться ими в самый непредсказуемый момент.
По правде говоря, у меня есть чёткое ощущение, что Rust - это не для всех (как и любая другая технология). Он, правда, довольно сложен в понимании, особенно поначалу и особенно для тех, кто не сильно стремился разобраться в предметной области. И хотя он уже довольно популярен, не могу сказать, что его активно внедряют в свои разработки (если судить по статистике на GitHub): всё же инерция в этих вопросах весьма велика. Python'у потребовалось почти 20 лет, чтобы получить признание и широкое распространение. Думаю, Rust имеет все шансы повторить этот путь.
Комментарии (59)
segment
09.06.2023 11:41+4Какое-то время уже присматриваюсь к Rust, задавал соответствующие вопросы, но так и не осознал пока в чем же он лучше/удобнее того же Си. Потому что довольно часто слышу что его сейчас предпочитают тому же Си в embedded разработке. И это не упрёк, мне действительно интересно, но когда я листаю код на github он выглядит для меня слишком замысловато для довольно простых действий, вероятно к нему нужно долго привыкать.
knikitin Автор
09.06.2023 11:41+2Знаете, на мой взгляд он нисколько не удобней си, скорее наоборот. Однако даёт несколько иной взгляд на программирование и вот это мне очень нравится.
agalakhov
09.06.2023 11:41+3Если на Rust писать как на Си, процедурно, не используя высокоуровневых возможностей, то он очень похож на Си, в том числе синтаксисом. В этом режиме он добавляет к Си несколько удобных вещей: ссылки на подмассив массива (сразу с длиной), проверку валидности времени жизни ссылок, работу с UTF-8, автоматический free для malloc. Под unsafe становятся доступны сырые указатели и открываются все опасные возможности Си.
Система типов Rust похожа на Haskell, а возможности структур аналогичны возможностям ООП-языков. Получается как C + Haskell + C# в одном, можно использовать возможности любого из языков, а можно все три одновременно, как больше нравится.
Source
09.06.2023 11:41Плюс ещё метапрограммирование нормальное в стиле Lisp - манипуляции с AST и т.д.
flx0
09.06.2023 11:41+4в чем же он лучше/удобнее того же Си
Раст позволяет ловить на этапе компиляции ошибки, которые в С превращались бы в отстреленные ноги.
AnthonyMikh
09.06.2023 11:41+1Не нужно писать типы у каждой переменной, явно помечаются изменяемые значения, а не наоборот, цикл по массиву — это именно цикл по массиву, а не танец с ручной инкрементацией переменной, местный аналог switch проверяет полноту покрытия и работает со строками, проигнорировать ошибку невозможно, не нужно вызывать free руками, в if-ах и while не нужно писать скобочки вокруг условия.
Да, это всё в основном поверхностные и синтаксические различия, но это то, что лично мне бросается в глаза при необходимости что-то писать на C (с учётом того, что Rust сейчас мой рабочий язык) и что раздражает.
Flux
09.06.2023 11:41+4Ничто не агитирует против раста так надёжно как его фанбои рассказывающие об идеальности языка с упорством достойным свидетелей Иеговы.
pererat_rs
09.06.2023 11:41Но он же идеален...))
0xd34df00d
09.06.2023 11:41+2Нет идеальных языков.
А у раста система типов ещё и слабая вдобавок.
KanuTaH
09.06.2023 11:41Нет идеальных языков.
Какъ же такъ, а Хаскель?
0xd34df00d
09.06.2023 11:41Завтипов нет и нормальных не будет никогда, рекорды так себе, ещё всякая ерунда по мелочи.
DancingOnWater
09.06.2023 11:41Если у раста она слабая, то что тогда по-вашему сильная?
sergey-gornostaev
09.06.2023 11:41Система типов Idris например.
DancingOnWater
09.06.2023 11:41А чем она сильнее?
0xd34df00d
09.06.2023 11:41+1Там есть зависимые типы, в расте — нет. Можно выразить больше свойств, инвариантов и требований.
Siddthartha
09.06.2023 11:41+2Мне понравилось -- было непросто, но очень лаконичный код дал гору функционала и прекрасные сообщения об ошибках. Сам принцип вариативного анализа, который заставляет обработать все ошибки и крайние случаи -- это реально впечатляет. Получается код, который чем-то похож на функциональные подходы -- уверенность в его надежности намного больше, чем обычно. А сообщения об ошибках сами собой получаются на порядок более человекопонятными, хотя ты о них даже не думал.
Siddthartha
09.06.2023 11:41журнал из 30 ошибок на 3 строчки кода, в какой-то момент, уже перестаёт пугать и даже удивлять
но, именно, если их не накапливать и компилировать без ошибок -- самое оно.
simenoff
09.06.2023 11:41Какие графические или GUI библиотеки посоветуете для Rust, чтоб не только через консоль его щупать?
agalakhov
09.06.2023 11:41+5egui + eframe. Работают на десктопных ОС и на вебе. Сайт https://www.egui.rs/ написан на egui и является демкой.
agalakhov
09.06.2023 11:41+2Где вариант "пробовал, теперь пишу преимущественно на Rust"?
simenoff
09.06.2023 11:41+1А также "Много, долго писал на Rust, перешёл на C++")
pererat_rs
09.06.2023 11:41+1Я перешел на Rust с плюсов
segment
09.06.2023 11:41Можете привести какой-нибудь показательный пример "так было" и "так стало", который отражает весь профит?
codecity
09.06.2023 11:41+1C Rust заморочка - чтобы вникнуть в тонкости - нужно на нем поработать. А его рейтинг - менее 1%, т.е. он еще не набрал а лишь набирает популярность. Ну и главный момент - будет ли он и далее набирать популярность? Вот, уже на подходе новый еще более крутой ЯП - Mojo. Не получится ли так, что только привык к Rust, соглашаясь работать за копейки (т.к. лишь изучаешь язык) - нужно переучиваться на Mojo?
aceofspades88
09.06.2023 11:41+6Не сказал бы что он прям набирает популярность, вакансий крайне мало, а те что есть в основном крипта. То что Mojo более крутой еще более сомнительно
includedlibrary
09.06.2023 11:41+2Я совсем не фата раста, т.к. мне на нём сложно писать, но профит от его использования хотя бы понятен - он не позволяет тебе делать многие небезопасные вещи, в т.ч. позволяет безопасно работать с памятью без GC. А в чём крутость питона с типами (если я правильно понял суть Mojo), это же просто очередной язык с GC
slonopotamus
09.06.2023 11:41чтобы вникнуть в тонкости - нужно на нем поработать
Мне думается, это утверждение верно для любого X, причём речь не только о программировании.
codecity
09.06.2023 11:41Так же кроме декламаций просьба написать конкретику, а именно - вот на этом языке делаю так а тут смотрите как.
d_ilyich
09.06.2023 11:41+1Я, если так можно выразиться, прошёл базовый курс по официальной книжке. Точнее, пробежал. Больше всего меня впечатлила глава 17, где на конкретном примере сравниваются 2 подхода к ООП-разработке.
Мне кажется, что были бы полезны примеры того, как надо и как НЕ надо делать в Rust'е. Условно, берётся некая задачка и реализуется на каком-то ЯП. Затем она переносится с минимально возможными переработками на Rust. Потом эта же задача реализуется "как надо" с нуля на Rust, с учётом его особенностей. И подробный разбор - что, почему и как. Чтобы сразу приучать мыслить по-растовски.
Хотя, это, наверное, относится к любому рекламируемому ЯП.
m03r
09.06.2023 11:41+5http://cliffle.com/p/dangerust/
Автор сначала "переводит буквально" код с C на Rust, а потом превращает его в идиоматический Rust, попутно даже выигрывая немного в производительности
sunsexsurf
09.06.2023 11:41+1Черт, а можете про симулятор роста плесени рассказать?
knikitin Автор
09.06.2023 11:41Можете посмотреть пост об этом, там внизу есть ссылка на демку и на исходники.
Если коротко: на по экрану хаотически движутся частицы, а в центре находится целевой неподвижный объект. Если частица оказывается рядом с целевым объектом, она перестаёт двигаться и становится целевым неподвижным объектом. Направление движения каждой частицы выбирается случайно на каждом цикле обновления (броуновское движение). Эмуляция выполняется до тех пор, пока все частицы не станут целевыми и неподвижными.
Alexandroppolus
09.06.2023 11:41По какой-то причине JS-версия чаще начинает заполнять правый нижний угол
Причина проста - активные точки чаще двигаются влево и вверх, чем вправо и вниз, т.е. чаще "набегают" на конструкцию справа и снизу. Почему так? Покажу на примере горизонтальных перемещений: пусть у нас строка "...001100...", где 1 - активные точки, у нас тут их две штуки подряд. Горизонтальная строка обрабатывается слева направо. Возможные пары перемещений: LL, LR. Невозможен RR, вторая точка блокирует первую. Вот отсюда и "перекос".
Реализацию на Rust не смотрел, не разумею Rust.
dronnix
09.06.2023 11:41+1Он необычный.
Он неисчерпаем.Вот это-то и пугает в масштабе команды 5+ человек.
SabMakc
09.06.2023 11:41+1Rust, конечно, крут.
Но, лично у меня оставил не лучшие впечатления.Очень сложный язык. Причем не из-за концепции владения переменной, или еще каких, а главным образом из-за макросов. Каждая библиотека пытается реализовать свой набор макросов, которые надо знать и уметь применять. В результате - очень много "магии" и синтаксического сахара пытаются получить. А по факту - шаг в сторону и не работает. Хорошие сообщения об ошибках выручают, но далеко не всегда. Очень много неочевидных моментов и сложностей возникает. В результате - порог входа становится высоким.
Кроме того, тип переменной вычисляется не только по левой части, но и по тому, как эта переменная потом используется. С этим конечно можно бороться, устанавливая тип каждый раз самостоятельно. Но это не выход - язык старается ограничиться простым
let
и избавляться от явного указания типов.И ресурсов это все требует - просто море.
Десятки гигабайт артефактов сборки (60GB в папкеtarget
- не предел).
Сборка в течении не секунд-минут, а десятков минут, а то и часов на современных системах ("на холодную", без кешей сборки). Впрочем, с "прогретым" кешем собирается достаточно быстро.
Оперативной памяти - тоже требуется немало.В общем неоднозначные впечатления Rust оставил.
freecoder_xx
09.06.2023 11:41У меня довольно большое web-приложение (ядро биржи) на 150 000+ строк кода собирается 15 минут с нуля на моём ноутбуке (релизная сборка, jobs = 4).
lieff
09.06.2023 11:41Погодите, 150к loc это примерно 6мб? Это довольно немного. Для сравнения Qt - 1.2 гб
SabMakc
09.06.2023 11:41+1У меня был относительно небольшой проект (1,4МБ папка
src
весит), у которого достаточно много зависимостей (50+ прямых зависимостей, 400+ объектов сборки). Отсюда и длительная сборка без кеша и большой размер этого самого кеша сборки. Да и размер - чистая сборка (debug) дает около 6GB артефактов на этом проекте, что крайне много, на мой взгляд.Впрочем, и другие Rust проекты, с которым приходилось работать, тоже отличались аппетитом к дисковому пространству. Даже самые простые проекты на несколько гигов разрастаются очень быстро.
Сюда же накладываются особенности компилятора Rust - в каталоге артефактов остаются предыдущие версии зависимостей и артефакты собранные предыдущими версиями Rust (что может добавлять проблем, если требуется использовать ночную версию компилятора).
Вот папкаtarget
и разрастается еще сильнее.
huaw
09.06.2023 11:41Не надо сравнивать с Питоном. Раст там близко не стоял, слишком высокий порог входа.
Нельзя просто так взять и начать писать на Раст в отличие от Питон.
Скорее всего он так и останется нишевым языком.
pererat_rs
09.06.2023 11:41Скорее всего он так и останется нишевым языком.
Конечно, питон же самый лучший язык.
slonopotamus
09.06.2023 11:41+2Нельзя просто так взять и начать писать на Раст в отличие от Питон.
Типа, можно взять первого попавшегося человека с нулевым опытом в программировании, посадим его за компьютер с установленным питоном, и он зафигачит нам какой-нибудь веб-магазин на джанге? Ага, конечно.
freecoder_xx
09.06.2023 11:41+1Скорее просто Rust не будут использовать как язык для обучения программированию и для написания маленьких простых программ. Но он и не претендует на эту нишу.
Вход в Rust действительно более крутой, чем во многие другие языки. Но зато дальше разобраться в нём становится проще, так как меньше неприятных нюансов и всякого заметённого под ковёр в других языках.slonopotamus
09.06.2023 11:41Вход в Rust действительно более крутой, чем во многие другие языки.
Вы меряете сложность входа с какого начального уровня знаний входящего?
agalakhov
09.06.2023 11:41Мы в качестве эксперимента попробовали обучать Rust'у 10-летних детей, имеющих до этого опыт только в Scratch. Результаты примерно такие же, как при обучении Python, с небольшой помощью пишут примитивные игры. Большая часть сложностей Rust - не сложность языка как такового, а сложность ломания привычек, наработанных в других языках.
gpaw
09.06.2023 11:41+1нет. сразу "нет" этой статье. я отвечу с позиции раст-разработчика:
Он быстрый.
да. он быстрый. но в определенных сценариях оптимизация кода совершенно неочевидна.
Он безопасный.
да. если вы пишете обычную либу в обычных условиях. так это и в других языках так.
а если вы пишете низкоуровневую библиотеку, где вы можете четко оперировать адресами памяти - вот тут раст может создать препятствия.Он необычный.
да. когда вы работаете в концепте написания обычного приложения - столкнетесь с отличной штукой - временем жизни переменной.
в остальном - не. я писал на десятках языков, раст - просто изумителен. но - язык.
Он отлично документирован
кстати, поправьте в оригинальной статье "от отлично..".
да!!!!!!! офигенная документация. но... тяга к документированию всего вносит свои коррективы. я очень хочу написать статью про вред инлайн-документации для разработки по. может, я и не прав.все остальное... знаете, раст не решит ваших проблем, если Вы - хреновый программист. не решит проблем когда решите, что O(n) алгоритм на раст быстрее O(log n) алгоритма на javascript в случае веба. раст - хороший язык, когда вы знаете, что хотите. как в си, например. но - раст. и я очень люблю этот язык.
gpaw
09.06.2023 11:41+2дополнения к своему комментарию. я люблю раст и расцениваю его как основной язык разработки. моя имплементация сравнений строк в бд на расте - я собираюсь писать об этом серию статей про сопоставления (collation) в базах данных, сравнениях. в бенчах я превзошел icu4x, и думаю что это интересно для хайлоада, например.
работа на низком уровне с памятью - тоже unsafe часть раста, который, с одной стороны, хочет занять нишу высокоуровневого языка с доступом к памяти, с другой стороны - низкоуровневого. тоже момент, который прямо требует статьи
pererat_rs
Да, когда я увидел этот язык мне он тоже сначала не понравился. Я не думал что он может быть быстрым и при этом безопасным. Сейчас Rust это мой любимый язык.