Этот пост является следующей частью Введение в язык программирования Go — часть 1. В этом посте мы более подробно рассмотрим преимущества Go.

Преимущества

1. Высокая поддержка параллелизма

Одним из больших преимуществ Go по сравнению с другими языками программирования является его высокая поддержка параллелизма. Стиль параллелизма в Go основан на CSP (Communicating Sequential Processes), описанном Тони Хоаром в 1978 году. Сам CSP представляет собой формальный язык, описывающий шаблоны взаимодействия в параллельной системе. Следовательно, Go использует каналы как способ общения. Затем я спрашиваю себя: «Почему они использовали CSP как способ создания параллельной системы?». Вот некоторые причины, которые я нашел:

  • Разработчики языка программирования Google уже знакомы с концепцией
  • Легко добавить концепцию в процедурный язык без изменения модели и добавления множества ограничений.
  • Успешная модель обеспечения высокоуровневой поддержки параллелизма. Чем выше ее уровень, тем проще ее использовать.

Чтобы реализовать высокую поддержку параллелизма, Go вводит несколько новых терминов: горутина и канал. Go использует их для реализации примитивного параллелизма. Традиционная многопоточная модель, такая как Java, C++ и Python, потребует потоков для связи друг с другом с использованием разделяемой памяти. Общая структура данных в этой памяти защищена блокировкой. Затем потоки будут соревноваться, чтобы получить первое место, чтобы использовать ресурс.

Не общайтесь, разделяя память; вместо этого делитесь памятью, общаясь.

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

Горутина

Проще говоря, горутина — это легковесная нить.

  • В то время как поток в другом языке программирования занимает около 1 МБ, горутина занимает всего около 2 КБ памяти (она содержит только 3 регистра данных, тогда как поток может содержать около 16 регистров).
  • Горутины (в пользовательском пространстве) мультиплексируются в потоки ОС (пространство ядра), а не имеют отображение 1: 1. Некоторые горутины будут связаны с потоком ОС. Поток ОС выполнит горутину. Если горутина заблокирована, то планировщик переключится на другую связанную горутину, которая будет выполняться потоком ОС. Горутина может быть заблокирована из-за того, что она ожидает отправки/получения данных по каналу, блокирует системный вызов (файловые и сетевые операции) и процесс цикла сборки мусора.
  • Стоимость горутины дешевая. Хотя создание и переключение потоков требует больших затрат, поскольку приложениям необходимо запрашивать потоки у ОС. Однако решение состоит в том, чтобы поддерживать пул потоков, который содержит доступные/зарезервированные потоки для приложений. С другой стороны, у горутины низкие затраты на создание, переключение и уничтожение. Он даже создается и уничтожается во время выполнения.

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

Канал

Канал — это метод, который позволяет горутинам общаться друг с другом.

Горутина отправляет и получает данные через канал. Есть 2 типа каналов, буферизованные и небуферизованные. Небуферизованный канал вмещает только 1 данные за раз, в то время как небуферизованный канал может вмещать более 1 данных за раз. Как только горутина отправляет данные по небуферизованному каналу, они блокируются до тех пор, пока другая горутина не получит данные. Но если горутина отправляет данные через буферизованный канал, они блокируются, если буфер заполнен. С другой стороны, горутина получателя блокируется, если данные не отправляются.

2. Легко учиться

Цель Go — повысить производительность. Таким образом, Go предлагает разработчикам простоту обучения и написания кода. Вы можете легко понять новый синтаксис за считанные минуты и создать приложение за несколько часов. С точки зрения командной работы, это повышает ваше сотрудничество в проекте. Это сократит временные затраты вашей команды на изучение самого языка, изучение существующего проекта, усовершенствование, устранение неполадок и даже создание приложения с нуля. Зная этот факт, неудивительно, что многие стартапы используют Go в качестве своих внутренних сервисов из-за их потребности в высокой производительности.

3. Ускорьте время компиляции

Стремление Go повысить производительность также поддерживается его компилятором. Go в первый раз нацелен на быстрое время компиляции, поскольку он хочет объединить преимущества интерпретируемого языка, который не требует затрат времени на сборку/компиляцию. Первый подход заключается в том, что компилятор Go проверяет наличие неиспользуемых пакетов/зависимостей. Он выдаст ошибку компиляции, если есть какой-либо неиспользуемый пакет. Таким образом, это помогает нам гарантировать, что обрабатываются только необходимые пакеты, что в конечном итоге увеличивает время сборки.

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

5. Один независимый исполняемый файл

Говорят, что Go является независимым от платформы языком программирования. Исходный код скомпилирован в двоичный файл как можно меньшего размера, что позволяет Go работать без необходимости в другой зависимости. Если скомпилированная Java-программа требует запуска JVM, Go требует запуска только самого себя. Для поддержки различных ОС у Go есть библиотеки для поддерживаемых операционных систем в качестве целевой ОС для кросс-компиляции. Мы могли бы указать целевую ОС с точки зрения конфигурации во время компиляции (например, через CLI).

6. Заполните достаточную стандартную библиотеку

Как было сказано в моем предыдущем посте, основное внимание в Go уделяется созданию параллельных и масштабируемых веб-сервисов. Более старый язык программирования, такой как Java, имеет среду Spring и Spring Boot, которые помогают вам создавать веб-службы. Однако это будет намного сложнее, если вы собираетесь работать с простой Java. С другой стороны, основные библиотеки для создания веб-сервиса (например, выборка HTTP для обработки веб-запросов и шифрования) были предоставлены в качестве стандартных библиотек в Go. Насколько я знаю, стандарт достаточно полный и надежный, даже стартап-единорог в Индонезии использует Go в качестве серверной части без веб-фреймворка для обслуживания миллионов людей.

7. Автоматическая сборка мусора с малой задержкой

Go разработан GC не только для 2015 года, но и для 2025 года и далее

Цитата из Официального блога Go. Go предназначен для значительного сокращения задержки сборки мусора (GC) за счет использования алгоритма десятилетней давности. Новый алгоритм Go GC основан на предложении Джикстры в 1978 году. Google считает, что этот алгоритм хорошо подходит для современных и будущих аппаратных возможностей и требований программного обеспечения к задержке.

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

Отказ от ответственности. Эта статья написана на основе моего понимания и цитируется из многих источников, которые я упомянул ниже. Я открыт для критики, оценок и предложений. Дайте мне знать, что вы думаете, написав свой комментарий ниже.

Ссылки