[uanog] Rust or Go?

Valentin Nechayev netch at netch.kiev.ua
Wed Mar 24 18:30:18 EET 2021


 Wed, Mar 24, 2021 at 17:02:32, doka wrote about "[uanog] Rust or Go?": 

> странно, но чёт захотелось какой-нибудь другой язык программирования
> выучить, компилируемый - так, чтобы с типизацией, со всей строгостью
> по закону, без этих вольностей "тут строка, а теперь - число".
> Конкретной задачи нет, это чисса интересно и проветрить мозг, но в
> совсем уж академически-маргинальное лезть не хочется - может
> всё-таки польза какая будет при случае :)
> 
> Rust или Go? Наверное, главный вопрос - наличие экосистемы
> библиотек/модулей, чтобы всё-таки была можливость не всякий раз
> лезть в low-level coding, а хотя бы раз через три? :)

Экосистема есть у обоих.
Свойство (которое может стать проблемой) у обоих языков: у них
объектная модель без наследования (у Go - с отдельными элементами
наследования, но костылём). Сейчас даже модно говорить, что так
правильно, но под эту модель надо заметно выгибаться.

Специфика Go:
+ Неплохая система конкурентности, позволяющая дешёвую асинхронность
на императивном коде.
+ Относительная лёгкость написания и чтения кода. От ряда фич типа
  переопределения операторов отказываются намеренно из-за возможных
  последствий типа "фиг его знает что скрывается за этим плюсом".
  Есть единственный канон на форматирование кода.
- Самое тяжёлое: агрессивно-невменяемое сообщество, выросшее из того,
  что по дизайну Go пошёл против массы вроде бы уже проверенных
  решений. Фактически большинство это или примитивисты, которым всё
  равно, что делать, или сектанты. Авторы языка подстёгивают это
  сектанство.
- Плохая типизация на уровне выше примитивных типов: она принципиально
  утиная в зависимости класса и интерфейса (сигнатура совпадает -
  считаем реализующим интерфейс, даже если совпадение недопустимо).
± Объектная система без наследования (есть косвенно через включение
  безымянного базового поля, но она не даёт, например, виртуальных
  функций).
- Язык предельно провоцирует копипастинг. Сложно объяснить, почему
  так, но это общее мнение всех кто пишет на нём и не фанат.
- Многословность из-за принципиального отказа от исключений (как в
  Rust, но не компенсируется макрами и прочими средствами для разбора
  ошибок).
  Картинка в тему: https://pbs.twimg.com/media/DCIF7-2W0AEAv9c.jpg
- Свой доморощенный кодогенератор, не использующий массу возможностей
  процессора - например, там в принципе нет передачи через регистры,
  всё через стек. Если бы не кэш, он был бы раз в 100 медленнее C :)
- Излишняя жёсткость в ряде мест (например, неиспользованный импорт не
  даёт скомпилировать, даже если это быстрая проба для отладки).

Rust:
± Отдельная модель управления памятью: и не ручное как в C/C++, и не
  автоматическое с GC; вместо этого концепция владения и
  заимствования. (И подсчёт ссылок для разделяемого между нитками.)
  К ней надо привыкнуть.
+ Система типов плавно приближается к тому, что делают в
  функциональных языках - это позволяет свалить на компиляцию много
  проверок, которые на других делаются только в рантайме.
± Пока компилятор согласится с кодом, можно поседеть ;) но после этого
  почти все проблемы устранены.
± Некоторые вещи не укладываются в концепцию владения (знаменитый
  пример - двусвязный список - можно сделать только на unsafe. Но
  genericʼи спасают - один раз сделал и дальше используешь.)
± Объектная система без наследования. Но есть traits (аналоги
  интерфейсов Java/C#) с возможностью их назначения чужим классам.

> Шо думаете?

Если из этих двоих, начни таки с Rust. Сбежать на Go успеешь всегда ;)


-netch-


More information about the uanog mailing list