Go vs Rust
Feb. 25th, 2021 09:52 amПериодически, когда заходит речь о новых языках программирования, у меня в комментариях возникают споры на тему того, что лучше Go или Rust.
Люди с математичеким образованием считают что Go крайне интересный язык, а Rust это так..
А мне, как практику Rust кажется намного симпатичнее. И не мне одному.
Вот ещё практики.
Похоже, что здесь ситуация примерно такая же как с C vs Pascal во времена нашей юности. Паскаль был симпатичнее, пока не надо писать и поддерживать сложные проекты. Вот похоже что с Go - то же самое. Правда Rust тоже наступает на те же грабли, обрастая своим cargo-культом. Но там это все же не так ярко выражено. И вообще zero runtime cost rules.
no subject
Date: 2021-02-25 07:21 am (UTC)Эксплуатационные характеристики rust-а при этом выше всяких похвал, но тот же ад со значениями, пропадающими из "использованных" переменных - просто жесть и издевательство :)
no subject
Date: 2021-02-25 07:25 am (UTC)К C по началу тоже такое отношение было "программа на C подобна городскопу - по расположению звездочек программист пытается предсказать ее поведение". Или то что оператор ++ увеличивает значение указателя не на единицу а на sizeof того, на что он указывает. Ничего, привыкли.
no subject
Date: 2021-02-25 04:30 pm (UTC)Там логика другая. Не булева. Надо привыкнуть к этому. Терпение.
no subject
Date: 2021-02-25 11:34 pm (UTC)305 кб против 14 в ELF 64-bit после стрипа.
no subject
Date: 2021-03-01 09:43 pm (UTC)echo "Hello, world"
И что с того? :)
Тут конечно, момент, что в Linux /bin/sh - интерпретатор по умолчанию...
no subject
Date: 2021-03-01 10:03 pm (UTC)Ну, хотя бы то, что rust позиционируется не как замена баша, а как конкурент C.
no subject
Date: 2021-03-01 10:27 pm (UTC)Так-то и современные компиляторы C, и rust/C++ добавляют в бинарник инициализационную часть. Но они же не предназначены для того, что бы запускаться лишь для того, что бы вывести строчку. К слову, когда-то давно были бинарники со статическими переменными - таких сейчас практически невозможно создать - т.к. в век многопоточности это бессмысленно и опасно (даже C аллоцирует доп. память при старте).
Так что по месту, занимаемым бинарником на диске (и даже в памяти) не имеет смысла сравнивать...
no subject
Date: 2021-03-02 01:14 am (UTC)В 300k исполняемого кода можно упихать не только вывод одной строки, но и четверть bash-а или половину awk-а.
Так что сравнивать размер бинарников с C/C++ очень даже имеет смысл. Другое дело, что размер этого статического кода потом не особенно увеличивается по мере роста исходника, но сам подход немного удивляет.
> К слову, когда-то давно были бинарники со статическими переменными - таких сейчас практически невозможно создать
Это вы что-то фантастическое сейчас написали, не подумав :)
no subject
Date: 2021-03-02 04:52 am (UTC)В 300К можно уписхать весь интерпретатор Tcl.
Но, увы, современные программисты настолько боятся dll hell что предпочтут таскать с собой целый virtualenv или докерный контейнер, лишь бы не надеятсья на наличие в системе динамических библиотек правильной версии.
И для этого есть основания. Например RedHat в 8-й версии чуть ли не в каждом минорном релизе меняет libllvm на несовместимую. А Альт тут недавно libreadline умудрился поменять без изменения номера версии дистрибутива.
no subject
Date: 2021-02-25 05:39 pm (UTC)Что интересно, у меня лично такая штука была с Go - объективно, должно быть, хороший язык, но субъективно меня от него воротит просто.
А вот Rust пробую понемногу и нравится все больше и больше, особенно после того, как я переключил в голове тумблер, чтобы воспринимать Rust не как C++ с одними классными штуками но без других классных штук, а как C с кучей классных штук.
С уважением, Dargot.
no subject
Date: 2021-02-25 07:30 am (UTC)Rust же позиционируется как "системный язык" - то есть прямая замена C и плюсам, но без их грехов.
Go - это язык для
купи-продайвебсервисов. По сути, компилируемый питон или жабаскрипт с намного более низким порогом входа, чем плюсы, и, возможно, даже жаба.Я от Go проходил только вводный курс, но то, что я там увидел - это корутины из коробки, темплейтинг из коробки, вебсервер из коробки и все такое. То есть это перемалыватель большого потока ввода-вывода поверх HTTP, причем либо REST-JSON, либо gRPC - то есть модные современные микросервисы и вот это все.
То есть переписать nginx или апач на Go - это туда-сюда, а вот, скажем, awk - нет. Rust же, наоборот, позиционируется как язык для переписывание не то, что awk, но даже ядра.
no subject
Date: 2021-02-25 09:14 am (UTC)Попытки переписать coreutils на Go находятся, но дохлые.
no subject
Date: 2021-02-25 09:20 am (UTC)И узких мест во всём остальном, ага. Так что те же nginx и апач я бы поначалу всё же на Rust переписывал, они рассчитаны на высокую нагрузку, причём мелкими порциями. Вот эти все тысячи запросов в секунду, и потребность отдавать файлы или данные от бэкэнда в драйвер сетёвки без промежуточного копирования в память. А вот всякие плагины, на которые нагрузка по тем или иным причинам невысока, можно и на чём-нибудь с GC.
no subject
Date: 2021-02-25 09:50 am (UTC)Я скажу за веб-бэкенд разработку, потому что это мне известно не только в теории. Если мы не говорим про гуглояндексы и прочие дискорды, то пишем поначалу на жабаскрипте или питоне (или даже похапе). Скорость разработки едва ли не максимальная, производительность (sanic и aiohttp не вчера придумали), на самом деле приемлемая.
Лирическое отступление: говорим как-то за то, что у нас на работе отдельные коллеги считают высоконагруженным компонентом. Я спрашиваю: сколько rps? Мне отвечают - 30к. Ну думаю, да, вполне культурно, мы ж не гуглояндексы с их мега-rps-ами. А потом мне уточняют, что это не rps, а rph. То есть, эм, 8 rps. Занавес.
А дальше, скажем, мы снимаем 100 rps с ядра, и когда наша нагрузка начинает измеряться кило-rps-ами, то наш ценник на железо начинает лезть вверх, и мы начинаем думать. И переписываем hot path на Go. Работа со строками почти такая же удобная, экосистема уже почти такая же развесистая - а скорость разработки все еще приемлемая, потому что корутины, channels и GC из коробки. Дальше мы начинаем снимать сотни rps с ядра, если не тысячу, и успокаиваемся.
И только потом, как в дискорде, к нам приходят проблемы с 95-99% перцентилью из-за GC. И только вот если нам на это не возложить, мы уже переходим на плюсы, а теперь раст.
Штука в том, что подавляющее большинство сервисов не доходят даже до момента, когда пхп/питон/жабаскрипт начинают жать, а подавляющее большинство остальных удовлетворяются переписыванием даже не всего сервиса, а только hot path на Go.
... а серьезный бизнес как сидел на решетке и жабе, так и сидит.
no subject
Date: 2021-02-25 10:40 am (UTC)Ну, серьёзному бизнесу нужна заменяемость персонала. Желательно — дешёвого, в идеале ещё и на аутсорсе. На плюсы, хэш и жабу натаскивают в Индии. Это часть бизнеса гм, «владельцев языка». Плюс экосистема. Легко нанять программиста, легко найти компонент, который решает почти эту задачу. Нуивот.
Пока у серьёзного бизнеса серьёзные клиенты, но у сайта их сравнительно мало (покупателей у, допустим, самсунга много, но часто ли они ходят на его сайт? Вот rps и невелико) писать и правда можно на чём угодно. А если пишет индус, то и смысла писать на языке, удобном для выражения мыслей и страхующем от дурацких ошибок, никакого. Оный индус задачу-то даже не пытается понимать, куда там об архитектуре думать... Зато с моторикой у него хорошо, по кнопкам он стучит быстро. И их много.
А с действительно серьёзным клиентом всё равно общаются не через сайт. И там нужен не Rust, а English, на хорошем разговорном уровне.
no subject
Date: 2021-02-25 09:30 pm (UTC)no subject
Date: 2021-02-25 04:09 pm (UTC)Я не вижу, как можно сравнивать. Rust для ювелиров, чтоб делать что-то точное и работающее. Go для того, чтобы лепить поделки, POC-level. Язык для тупых.
Текст по линку блестящий. Спасибо.
no subject
Date: 2021-02-25 05:06 pm (UTC)Есть языки, на которых могут писать тупые, и языки, на которых тупые писать не могут - ко вторым относится, к примеру, Це, быстро и решительно отстреливающий тупому автору ногу. Но это не вина языка, а вина говнокодеров. К которым я нередко причисляю себя, особенно когда вижу, какую ересь писал год назад, и так каждый год.
Го офигенный язык для своего круга задач, и не его вина, что этот круг сейчас зело широк. Мне не нравятся отдельные идиосинкразии в его синтаксисе (У нас нет ООП, но есть функции, которые берут первым аргументом указатель на структуру... у нас не K&R C, на котором иначе никак, пошто на синтаксический сахар поскупились?), но очень нравятся каналы и горутины из коробки - это реально удобнее питоновского asyncio, не говоря про бустовый asio с его бесстековыми корутинами, которые одновременно пинцет быстрые и пинцет геморные в отладке и понимании кода.
Это не PoC-level. Это когда нужны тысячи rps с ядра, но еще не десятки тысяч (тут нужны плюсы или помянутый раст).
no subject
Date: 2021-02-25 04:19 pm (UTC)Но Go, несмотря на свою корявость, сильно удобнее - меньше плясок с несходящимимся закорючками, понятнее, итп.
no subject
Date: 2021-02-25 04:25 pm (UTC)no subject
Date: 2021-02-25 06:06 pm (UTC)Сейчас вот нат нем fft переписали и активно пилят ML - наример Rust BERT.
На днях нашел прекрасное: вот так (https://nickb.dev/blog/leveraging-rust-to-bundle-node-native-modules-and-wasm-into-an-isomorphic-npm-package) надо писать библиотеки для джаваскрипта
no subject
Date: 2021-02-25 07:20 pm (UTC)Оно можно быстро, очень быстро, но без него лучше.
Хотя если память не важна, а важны потоки,
то лучше Go чем Python.
no subject
Date: 2021-02-25 07:46 pm (UTC)Раст я на практике не пробовал, только книжку читал, и он выглядит скорее как Си++ в смирительной рубашке. Но большая часть выразительности Си++ в нем вроде бы сохранена. Хоть и не полностью, часть пожертвована во имя усиления статически проверок.
no subject
Date: 2021-02-27 09:16 am (UTC)Как писал ещё полвека назад профессор Дийкстра, "язык будущего для программистской техники прошлого" :)
Я не знаю, что подвигло Гугл создать собственный язык вместо того, чтобы вложиться в разработку качественного jit-компилятора для питона, с которого он на go и переполз в массе своей, но "что выросло, то выросло".
no subject
Date: 2021-02-27 09:43 am (UTC)Ну видимо, людям не jit был нужен, а нормальный компилятор. У компилируемых языков совершенно другая схема деплоймента, чем у скриптовых. Хотя go взял половину оттуда, половину отсюда, причем обе половины - худшие.
no subject
Date: 2021-02-27 05:14 pm (UTC)no subject
Date: 2021-03-01 10:08 pm (UTC)no subject
Date: 2021-03-01 09:56 pm (UTC)В принципе, они идеально справились - хороший язык появился, хотя лично мне не нравится своей "низкоуровневостью".
no subject
Date: 2021-02-26 07:40 am (UTC)Печаль, конечно, что жлобы из гугля ограничили синтаксические радости только встроенными типами. Но горутины- ничего так, шустрые. И, с каналами, даже удобные. Готовых библиотек много и есть даже приличные - тот же постгрес задействовать удалось без особого геморроя. Мусорщик, конечно, доставляет отдельно - в бурстах может жрать бездну ресурсов. Но в целом - терпим. Ну и за микроаллокациями (читай - за Xprintf) следить надо. Хотя бы в main path.
Надо бы, конечно, и в Раст пристальнее глянуть... Хотя Це же есть...