Владимир Зарыпов (krre31) wrote,
Владимир Зарыпов
krre31

Category:

Океан. Rust

В разработке проекта случился неожиданный поворот. В прошлой статье я торжественно пообещал, что бэкенд будет писаться на языке Go. И действительно, первую неделю я так и делал, то есть беззаботно писал сервер на Go и горя не знал. Однако, по мере гугления инфы на тему, какие существуют зарекомендовавшие себя практики грамотной разработки бэкенда на Go, я то и дело сталкивался с тем, что этот язык подозрительно часто сравнивают с Rust. То одни переписали свой сервер с Go на Rust, то другие, и теперь не могут нарадоваться. Это что ещё за нездоровая тенденция?

Я тоже тыкал палочкой этот Rust несколько лет назад, он мне даже понравился, но я так и не придумал, где его можно применить. В то время он и сам ещё не нашёл своей ниши, был в каком-то смысле изгоем. Куда бы он ни сунулся, везде всё занято, и отовсюду его гнали. Область системного программировании прочно занята языком C, в геймдеве - C++, в бэкенде и так слишком много всяких языков - с десяток, если не больше, и добавлению ещё одного там не сильно были рады. Так и юзали этот Rust сама Mozilla, которая его разработала, и несколько контор различной степени серьёзности в качестве эксперимента. Я в те годы бэкендом ещё не увлекался, поэтому пытался применить Rust в геймдеве, однако, во-первых, обнаружил, что геймоделы в целом весьма нелестно отзываются от Rust, а, во-вторых, после того, как мне за два дня так и не удалось откомпилировать программу, использующую многопоточность, пришлось поневоле вернуться на C++.

И вот, значит, Go, любимец публики, простой, как две копейки, и быстрый, как понос. С чего бы это вдруг его стали сравнивать с Rust? А дело в том, что у них много общего. Оба статически типизированы и компилируют программу в машинный код. Оба не используют исключения, а возвращают из функций коды ошибок. Оба вместо наследования используют утиную типизацию. У обоих имеется похожий набор тулзов, типа автоматического форматирования кода, запуска тестов и бенчмарков. Даже команда для внезапного прерывания потока выполнения одинаково называется - panic. Однако есть и ряд отличий.

Прежде всего, в Go очистка памяти производится через сборщик мусора, а в Rust для этого придумана хитрая модель управления памятью на уровне семантики языка. В Go нет дженериков, а в Rust они были изначально. В Go можно оперировать нулевым указателем (что есть большое зло, как известно), а в Rust ни в коем случае нельзя (хвала небесам). В Go нет макросов, а в Rust реализация макросов лучшая из существующих ныне языков. В Go есть зелёные потоки (горутины), а в Rust они тоже сперва были, но потом их выпилили к чертям. В целом Go намного проще, чем Rust, который, как бы это сказать, более строгий и математичный. То есть, скажем, какой-нибудь пионер, ещё не закончивший школу, но уже пытающийся выполнять заказы по программированию на фрилансе, вряд ли сможет это делать на Rust, потому что для этого нужен более окрепший и обременённый горьким опытом моск.

Есть ещё одно существенное различие между этими языками. Rust развивается семимильными шагами, а Go стагнирует и уже давно. Дженериков в нём как не было так и нет, и даже ходит суеверие, распространяемое самими разработчиками языка, что они вообще не нужны. Обработка ошибок в Go  -  это боль и мучение, тогда как в Rust для этого внедрена целая изящная система. Модули и управление зависимостями в Rust используются уже сто лет и не вызывают нареканий, а в Go добавили только недавно, но и то, что у них в итоге получилось, глаза б мои лучше не видели - я глубоко разочарован. Также Rust бессовестно передрал у Go их хвалёные каналы для общения с потоками (привет братьям-клептоманам!), а в конце прошлого года зарелизил поддержку асинхронного программирования - краеугольный камень для плодотворной обработки сетевых запросов.

В итоге получилось, что в Rust есть всё то полезное, что есть у Go, но зато нет богомерзкого сборщика мусора, которого и я тоже люто ненавижу. Стоит ли тогда удивляться, что сейчас во всех книгах по Rust обязательно есть глава, посвящённая бэкенду? А разуверившиеся в Go программисты смотрят не в сторону Python или Java, а в сторону Rust. Итак, похоже, что Rust всё-таки нашёл свою нишу. Он решил выпереть из бэкенда Go!

АХАХАХАХАХАХАХАХА!!! :)))))

Если ещё и C++ отовсюду выперет, то я тоже буду очень рад.

Короче говоря, я отложил в сторону Go и начал экспериментировать с Rust. Первые две недели ушли на то, чтобы прочитать документацию и разобраться с тем, как этим сложным чудом враждебной техники управлять, а потом я начал писать код. К моему удивлению, недостатка в библиотеках для разработки сервера не было. Даже более того. Оказалось, что бэкенд сайта https://crates.io, в котором все библиотеки и хранятся (на языке Rust они называются крейтами), тоже написан на Rust, а на GitHub лежат его исходники. Поскольку каталог крейтов и мой каталог мандел в некотором смысле похожи, то и бэкенды у них тоже будут немного похожи. Моё клептоманское нутро аж затрепетало, и я радостно кинулся передирать код каталога крейтов в свой каталог мандел. Изобретение открытых исходников, на мой взгляд, является вторым великим изобретением в программировании после изобретения самих исходников.

Tags: океан
Subscribe

Posts from This Journal “океан” Tag

  • Океан. Хлам

    Добавил перемещение низкорейтинговых мандел в хлам. Это значит, что такие манделы не будут показываться в общем каталоге, но будут видны, если…

  • Океан. Полнотекстовый поиск

    Сделал, наконец, фичу, реализацию которой очень долго откладывал, потому что она сложная, а я животное ленивое и сложностей очень боюсь.…

  • Океан. Лента новостей

    Придумал новую киллер-фичу - ленту новостей. Она объединяет в себя сообщения о появлении новых мандел, комментариев к манделам, новых тем на форуме…

  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 14 comments

Posts from This Journal “океан” Tag

  • Океан. Хлам

    Добавил перемещение низкорейтинговых мандел в хлам. Это значит, что такие манделы не будут показываться в общем каталоге, но будут видны, если…

  • Океан. Полнотекстовый поиск

    Сделал, наконец, фичу, реализацию которой очень долго откладывал, потому что она сложная, а я животное ленивое и сложностей очень боюсь.…

  • Океан. Лента новостей

    Придумал новую киллер-фичу - ленту новостей. Она объединяет в себя сообщения о появлении новых мандел, комментариев к манделам, новых тем на форуме…