Обложка: Что делает Go таким необычным?

Что делает Go таким необычным?

Сегодня Go — один из самых востребованных языков программирования. Вот секретный ингредиент его успеха.

Введение

Очевидно, что языки программирования можно рассматривать как основной инструмент в арсенале каждого разработчика. Мы склонны считать себя в некотором роде особенными. То есть формируем сообщества, пишем статьи, делаем видео на YouTube, маскоты и, что более важно — мемы. Шучу. Но всё же трудно отрицать существование некой тесной, почти личной связи между нами и этими абстрактными инструментами.

Как вы, наверное, догадываетесь, эта статья одна говорит о распространённом, новаторском и довольно необычном языке программирования под названием Go. Чтобы соответствовать Go — быть простым, полезным и нетривиальным — я не буду пересказывать то, что уже написано другими. А скорее попытаюсь сформировать новое видение — проанализировать дизайн, историю появления и особенности языка Go, а также, наконец, рассказать, где его лучше использовать.

Краткий обзор

Вот тезисы, которые дадут прочувствовать Go:

  • Go отличается от других языков, но всё ещё похож на них;
  • Go молодой, но уже широко распространён;
  • Go лёгкий, но мощный;
  • Go простой и одновременно сложный;
  • Go работает сам по себе — за исключением некоторых случаев;
  • Go — это и язык, и идея.

Теперь давайте рассмотрим каждый из пунктов подробно.

Контекст создания

Чтобы понять природу Golang, давайте взглянем на контекст создания. Однажды компания Google столкнулась с проблемами, которые не получилось решить с помощью готовых инструментов. Так что Go родился благодаря сильной потребности в изменениях:

Цели проекта Go состояли в том, чтобы сделать разработку программного обеспечения в Google не такой неуклюжей и медлительной. И вместе с тем сделать сам процесс более продуктивным и масштабируемым. Этот язык разработали люди, которые пишут, читают, отлаживают и поддерживают большие системы, — Роб Пайк, создатель Golang.

Как уже было сказано, Go разрабатывали, с учётом набора пока нерешённых задач. А также изначально вложили в него базу лучших функций, взятых из C, Pascal, Modula и Oberon. К тому же создатели ориентировались на полезные фишки Python, C++, Java и т. д. — критику которых Go был призван устранить.

Ограничения языка

Речь никогда не шла о копировании того, что уже было. Скорее о том, чтобы придумать новый способ решения проблем. Иногда для того, чтобы решить вопрос, требуется изучить старые, неэффективные методы и отказаться от них. И потому важные особенности языка Go возникли из его основных ограничений. Например:

  • простой и чистый синтаксис сделал язык читаемым и лёгким для изучения;
  • строгая, безопасная и статически типизированная семантика подошла для обработки статических ошибок во время компиляции и ускорила процессы выполнения и сборки;
  • наличие сборщика мусора, притом очень эффективного, помогло решить проблему небезопасного доступа к памяти и одновременно обеспечило высокую скорость исполнения и эффективное использование ресурсов;
  • отсутствие общих характерных черт и сахарного синтаксиса сделало язык минималистичным, точным и простым. В Go только один способ решения конкретной проблемы и один стиль использования этого самого способа. Это ускоряет разработку, отладку, обзор и тестирование процессов и делает обслуживание гораздо проще
  • отсутствие общих принципов объектно-ориентированного программирования, таких как наследование и классы пригодилось, чтобы ответить на критику ООП, которая распространяется всё быстрее после появления функционально-ориентированных языков — впрочем, и сам Go частично является таковым, будучи мультипарадигмальным языком. К тому же, это способствует ортогональности языка.
  • наличие вендоринга (заменённого модулями с 1.11), надёжной системы управления зависимостями и ассемблера, чрезвычайно близкого к двоичному представлению, позволило добиться поразительно быстрых сборок, и сохранить компактность и лёгкость. Это отличное сочетание для проектирования архитектуры микросервисов и для облачной разработки в целом.
  • отсутствие оператора исключений try-catch. Это своеобразный, спорный и критикуемый способ работы с ошибками, но в Golang он подошёл для многого: предотвращает возврат ошибок, сохраняет скорость и эффективность потока управления, сохраняет код чистым и читабельным, делает процесс написания и отладки кода проще.

Как видим, разработчикам Go удалось придумать эффективную систему языковых ограничений и получить набор отличительных характеристик и возможностей. Эта впечатляет: используя каждое из ограничений, язык приходит не к одной, а сразу к нескольких характерным чертам.

Должен отметить, что метод определения особенностей языка Go на основе ограничений, к которому я здесь прибегаю, основан не только на цитатах его создателей, блогах и речах, а также официальной документации и статьях других авторов. По сути, это личный способ понимания и описания природы и уникальности Golang. Конечно, можно согласиться, либо не согласиться с моей точкой зрения и любить или ненавидеть этот язык абсолютно нормально. Более того, я призываю не верить наслово, а провести собственное исследование этой темы.

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

Многие новички, переходят на Go и требуют включить особенности из языков, которые они уже знают. Но эти особенности не принадлежат Go, и язык фиксирован. Добавление новых функций не сделало бы его лучше — просто больше. Он остаётся интересным, благодаря ограниченности, — Роб Пайк, создатель Golang.

Особенности языка Go

Ограничения не означают, что Go неполный или не пригоден для выполнения некоторых задач. Так можно назвать все программирования бесполезным — ведь «почему бы не пользоваться языком ассемблера?». У Go есть свои особенности. Дело в том, для простоты он сознательно отказался от функций, которые усложняют язык, но не решают конкретные проблемы. По сути, это и сделало Go своеобразным.

Так что же насчёт функций, которые сумели стать частью Go? Ну, на самом деле, правило преднамеренной простоты действует и на них. Я имею в виду, создатели Golang проделали невероятную работу чтобы сделать нечто лёгкое в использовании, на первый взгляд, но сложное «под капотом».

Go сложен. Это, на самом деле, одна из самых сложных вещей, над которыми я когда-либо работал, и всё же она кажется простой… Это потребовало долгого проектирования, обдумывания, труда, связанного с реализацией, и доработок. Простота — это искусство скрывать сложность! — Роб Пайк, создатель Golang.

Давайте посмотрим на «простые» вещей в Go:

  • Сборщик мусора — это, по сути, самая простая функция Go, ведь у неё нет интерфейса управления. Тем не менее, она же и самая сложная — ведь сборщик обеспечивает полную безопасность памяти, сохраняя при этом чрезвычайно высокую скорость исполнения программ и обеспечивая удивительную эффективность использования ресурсов. Браво создателям!

Да Go не самый быстрый язык программирования — ведь у нас есть Rust, Julia, C++и C. Но у них нет сборщика и поэтому они даже близко не так просты, как Go. Также часто лёгкость достигается благодаря следующей фишке.

  • Параллелизм, или горутины — простая и прямая реализация модели параллелизма. Создание нового подпроцесса, на самом деле, настолько легко, что кажется, будто вы вообще не сделали. Всё, что нужно — это набрать go. Это просто, и проще быть не может, верно?
  • Интерфейсы, несомненно, узнаваемая особенность Golang. Их уникальное дизайнерское решение само по себе отвечает на большую часть критики ООП, обеспечивает ортогональность и истинную компонентную архитектуру, будучи лишь бесполезным набором методов, который всё ещё скрывает хитроумные дизайнерские трюки.
  • Пакеты. Проще говоря, они потрясающие. Работают плавно, без сюрпризов, и их очень приятно использовать, особенно для импорта. Используя go get, ими можно пользоваться практически из любого места: Gopkg, GitHub, GitLab, BitBucket, даже из собственного размещённого репозитория — с тех пор как появился путь vanity import. Но думаю, вы уже знаете, как это делается… Да, они, на деле, сложно устроены. Это позволяет им обеспечить компонентизацию, модульность, масштабируемость, совместное использование, скрытие данных и изоляцию и так далее.
  • Стандартная библиотека Go содержит массу удобных функций, что доказывает: Golang — это, на самом деле, многофункциональный язык. Уникальными функции делает способ реализации. Например, с помощью import "net/http" вы сразу получаете вышеперечисленные функции в, высокопроизводительном, безумно простом в использовании и стабильном веб-сервере.
  • Отражение не так легко использовать, как другие фишки в этом списке, поскольку не является простым процессом в любом языке программирования. Тем не менее Go всё ещё удаётся реализовывать его относительно удобно для пользователей.

Отражения иногда можно намеренно избегать в пользу другой парадигмы Golang — кодогенерации, которая с точки зрения идеологии Go более ясна и эффективна. Я лично думаю о ней как о «белой магии» и, конечно же, буду отстаивать её преднамеренное использование. Ведь иногда она открывает волшебные возможности, хотя и не так эффективна.

Ну вот и всё. Набор функций Golang — результат продуманного решения серьёзной проблемы языкового дизайна — выбора только правильных функций без усложнения и языка и с сохранением ясности.

Простоту очень трудно спроектировать. Но если сделаете это правильно, получите то, что легко использовать. И успех Go это доказывает! — Роб Пайк, создатель Golang.

Область Применения

Итак, теперь ясно, что у языка Go есть некоторые особенности. Также он прост в использовании, быстр и продуктивен. Но в каких областях он особенно полезен? Что можно сделать благодаря ему?

Некоторые классические языки программирования, такие как C# и Java, за время существования сумели пробраться практически во все области разработки приложений. Так что конкурировать с ними сложно. Но Go и не пытается это сделать. Его создали с конкретной целью, и он по определению не является языком общего назначения.

Однако, на самом деле, цель, «вроде как, одна».

Видите ли, несмотря на то, что изначально Google сделал язык для разработки своего софта и обслуживания собственной среды, как только Go стал проектом с открытым исходным кодом и быстро расширил сообщество, стало ясно, что программисты хотят использовать его для гораздо большего количества задач. С выпуском Go 1 он считается языком общего назначения.

Но на этом процесс обобщения Golang не закончился. Сообщество становится больше, расширяет область использования языка и продолжает создавать новые инструменты, пакеты, фреймворки, драйверы, API, генераторы кода и ещё более удивительные вещи, которые заставляют новых разработчиков верить, что Go действительно может стать их следующим основным языком. Совсем как в моем случае!

Давайте посмотрим, на что способен Go:

  • облачная разработка веб-сервисов, особенно микросервисов с помощью Go kit, Micro, Gizmo, Kite, Goa, Caddy;
  • разработка REST API с помощью Gin, Martini, Revel, Gorilla, Beego;
  • разработка RPC API с помощьюg RPC, Twirp, Spiral, Gorilla;
  • разработка API GraphQL graphql-go, gqlgen, thunder;
  • разработка бессерверных функций с помощью фреймворков для бессерверных приложений, Google Cloud Functions, Sparta, Gordon;
  • разработка веб-интерфейса (WebAssembly) с помощью Hugo, Vugu, TinyGo, Vecty;
  • робототехника, IoT и разработка встраиваемых систем с помощью Gobot, Mainflux, TinyGo, EMBD;
  • разработка приложений CLI с помощью Cobra, cli;
  • машинное обучение и разработка искусственного интеллекта с помощью GoLearn, Gorgonia.

И некоторые не особенно очевидные случаи использования:

  • разработка мобильных приложений с помощью gomobile;
  • разработка настольных приложений с помощью Lorca, Wails, Fyne;
  • разработка игр с помощью Ebiten, Pixel, G3N;
  • разработка чат-ботов для Discord, Telegram, Slack, more;
  • развитие блокчейна и смарт-контрактов.

На данный момент сфера применения Golang явно больше ориентирована на облачное, веб- и системное программирование. Но благодаря энтузиазму, инициативности и активности сообщества Go неуклонно пробивает путь почти во все сферы IT-индустрии.

Заключительные Мысли

Я пользуюсь Go уже почти год, и всё ещё очарован им. Работать на нём — потрясающе, особенно, когда вы можете наблюдать, как благодаря ему производительность растёт.

Идеология, лежащая в основе Go — это признание того, что написание кода часто — меньшая часть процесса разработки. Потому язык избавился от излишней выразительности, ради простоты, ясности и эффективности других важных аспектов работы: обслуживания, просмотра, чтения и редактирования кода.

Думаю, разработчики Golang проделали невероятный труд по проектированию и реализации проекта — в результате мы получили один из самых удобных и экономически эффективных языков. Создатели искали способ повысить скорость и продуктивность разработки и обслуживания больших кодовых баз, и потому Go стал отличным инструментов повышения производительности.

Чтобы подытожить рассказ об уникальности Golang и помочь разобраться, подходит ли вам этот язык, я хотел бы привести главный для себя тезис из идеологии Go, ещё раз процитировав его создателя:

Базовый компромисс в Go — вопрос, к которому подошли иначе, чем в других языках — Чего вы хотите: язык, с которым веселее или проще работать? — Роб Пайк, создатель Golang.

Оригинальная статья