Десять лет назад компания Google представила многопоточный компилируемый язык программирования Go, или Golang. Разработчики не рассчитывали на успех предприятия, но надеялись привлечь внимание к особому способу структурировать выполнение кода.
Рассказываем, как развивался Go, и почему стоит его изучить.
Как все начиналось
Язык программирования создали разработчики Кен Томпсон, Роб Пайк и Роберт Гризмер внутри компании Google. Томпсон внес огромный вклад в разработку языка С, а также в создание ОС Unix. Пайк написал для Unix графический терминал Blit, а также в соавторстве с Брайаном Керниганом выпустил фундаментальные книги «Практика программирования» и «UNIX. Программное окружение».
Первая версия Go появилась как собственный язык для ОС Inferno и облачного ПО. Но со временем Go стал полноценным языком программирования. Язык активно используют облачные провайдеры, на нем удобно создавать высокоэффективные программы для многоядерных процессоров и распределенных систем.
Особенности языка
Go – язык с С-подобным синтаксисом и строгой типизацией. Для пользовательских типов используется неявная «утиная типизация», как в Python, JavaScript или Ruby. В Go можно использовать указатели, но без адресной арифметики для них. Реализованы готовые динамические массивы, срезы, хеш-таблицы. Есть циклы для обхода коллекций и строковый типы с интегрированной поддержкой юникода.
Формально Go – объектно-ориентированный язык, но наследовать здесь можно только интерфейсы. Так что правильнее считать его языком процедурным, но с поддержкой интерфейсов. Кроме того, в Go доступны средства функционального программирования – передача функций как параметров, возврат функциональных значений, замыканий и неименованные функции.
Главная особенность Go – горутины. Горутины – потоки, встроенные в язык, с которыми можно взаимодействовать через каналы. Реализованы и другие инструменты для многопоточного программирования. Благодаря горутинам язык успешно справляется с многозадачностью и позволяет масштабировать приложения при росте количества ядер процессора. Новые потоки эффективно используют память. Миллионы горутин можно прокручивать вместо потоков. Они быстрее и безопаснее обмениваются данными, позволяют обойтись без блокировки мьютексов. К тому же одна горутина может запускаться в нескольких потоках. Также горутины можно объединять в небольшое количество потоков операционной системы.
Классов в Go нет. Любая программа состоит из пакетов и модулей, к тому же функции в Go могут возвращать несколько значений. Начать работать с Go просто, а опытных разработчиков приятно удивит количество и качество «синтаксического сахара». Управление памятью в Go автоматическое, есть сборщик мусора.
На Go сложно «выстрелить себе в ногу»: от всего потенциально опасного разработчики отказались. Например, убрали переопределение функций и методов, затратные вставки элементов в середину массива, отрицательные индексы, наследование реализаций и др. Наконец, Go запускается прямо на железе. С одной стороны, это низкоуровневый язык с максимальной производительностью и отличным сборщиком мусора. С другой – он простой и безопасный, поэтому код на Go легко поддерживать.
Поддержка Go
Для Go создали набор инструментов разработки gc, который уже поддерживают Windows, Linux, macOS, Android, а также FreeBSD, OpenBSD, DragonFly BSD и другие системы. В наборе – средства компиляции, тестирования и управления пакетами, а также вспомогательные утилиты. Набор компиляторов gcc поддерживает новый язык, причем существует несколько независимых реализаций. Есть компилятор gccgo с рекурсивным парсером, который совмещен со стандартным бэк-эндом gcc.
Развиваются и независимые проекты. К примеру, на самом Go сделали прослойку llgo для компиляции Go в llvm. Google поддерживает проект gollvm для компиляции Go через систему компиляторов LLVM. Запускать программы на Go также можно с помощью интерпретатора SSA interpreter.
Более современный вариант – IDE (интегрированные среды разработки). Помимо проприетарной GoLand, которую на платформе IntelliJ разработала компания JetBrains, есть бесплатная LiteIDE. Кроме того, поддержку Go внедрили в популярные среды Eclipse, NetBeans, IntelliJ, Komodo, CodeBox IDE, Visual Studio, Zeus и т.д. Подсветка синтаксиса добавлена в Emacs, Vim, Notepad++, jEdit и других.