Go будет серверным языком будущего, - Тобиас Лютке, Shopify

В последние пару лет появился новый язык программирования: Go или GoLang. Ничто так не сводит разработчика с ума, как новый язык программирования, верно? Итак, я начал изучать Go 4–5 месяцев назад, и здесь я расскажу вам, почему вам также следует изучить этот новый язык.

Я не собираюсь учить вас, как писать «Hello World !!» в этой статье. По этому поводу есть много других статей в Интернете. Я собираюсь объяснить текущий этап компьютерного аппаратного и программного обеспечения и зачем нам нужен новый язык, такой как Go? Потому что, если нет никаких проблем, нам не нужно решение, верно?

Аппаратные ограничения:

Закон Мура не работает.

Первый процессор Pentium 4 с тактовой частотой 3,0 ГГц был представлен еще в 2004 году компанией Intel. Сегодня мой Mackbook Pro 2016 имеет тактовую частоту 2,9 ГГц. Таким образом, почти за одно десятилетие необработанная вычислительная мощность не сильно улучшится. Вы можете увидеть сравнение увеличения вычислительной мощности со временем в таблице ниже.

Из приведенной выше диаграммы видно, что однопоточная производительность и частота процессора оставались стабильными в течение почти десятилетия. Если вы думаете, что добавление большего количества транзисторов является решением, то вы ошибаетесь. Это связано с тем, что в меньшем масштабе начинают проявляться некоторые квантовые свойства (например, туннелирование), и потому, что на самом деле установка большего количества транзисторов обходится дороже. (Почему?) И количество транзисторов, которые можно добавить за доллар, начинает падать.

Итак, для решения вышеуказанной проблемы,

  • Производители начали добавлять в процессор все больше и больше ядер. В настоящее время доступны четырехъядерные и восьмиъядерные процессоры.
  • Мы также ввели гиперпоточность.
  • Добавлен кэш-память процессора для увеличения производительности.

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

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

Современные процессоры похожи на забавные автомобили, работающие на нитро-топливе, они превосходны на дистанции в четверть мили. К сожалению, современные языки программирования похожи на Монте-Карло, они полны перипетий . - Дэвид Ангар

В Go есть горутины !!

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

Но большинство современных языков программирования (например, Java, Python и т. Д.) Относятся к однопоточной среде 90-х годов. Большинство этих языков программирования поддерживают многопоточность. Но настоящая проблема связана с одновременным выполнением, блокировкой потоков, условиями гонки и взаимоблокировками. Эти вещи затрудняют создание многопоточного приложения на этих языках.

Например, создание нового потока в Java неэффективно с точки зрения памяти. Поскольку каждый поток потребляет около 1 МБ размера кучи памяти, и в конечном итоге, если вы начнете вращать тысячи потоков, они окажут огромное давление на кучу и вызовут отключение из-за нехватки памяти. Кроме того, если вы хотите общаться между двумя или более потоками, это очень сложно.

С другой стороны, Go был выпущен в 2009 году, когда уже были доступны многоядерные процессоры. Вот почему Go создан с учетом параллелизма. В Go вместо потоков есть горутины. Они потребляют из кучи почти 2КБ памяти. Итак, вы можете запускать миллионы горутин в любое время.

Другие преимущества:

  • Горутины имеют растущие сегментированные стеки. Это означает, что они будут использовать больше памяти только при необходимости.
  • Горутины запускаются быстрее, чем потоки.
  • Горутины поставляются со встроенными примитивами для безопасного взаимодействия между собой (каналами).
  • Горутины позволяют избежать блокировки мьютексов при совместном использовании структур данных.
  • Кроме того, горутины и потоки ОС не имеют сопоставления 1: 1. Одна горутина может работать в нескольких потоках. Горутины мультиплексируются в небольшое количество потоков ОС.

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

Все вышеперечисленное делает Go очень мощным для обработки параллелизма, такого как Java, C и C ++, при этом код выполнения параллелизма остается прямым и красивым, как Erlang.

Go работает непосредственно на базовом оборудовании.

Одним из наиболее значительных преимуществ использования C, C ++ по сравнению с другими современными языками более высокого уровня, такими как Java / Python, является их производительность. Потому что C / C ++ компилируются и не интерпретируются.

Процессоры понимают двоичные файлы. Как правило, когда вы создаете приложение с использованием Java или других языков на основе JVM, когда вы компилируете свой проект, он компилирует читаемый человеком код в байт-код, который может быть понят JVM или другими виртуальными машинами, которые работают поверх базовой ОС. Во время выполнения виртуальная машина интерпретирует эти байт-коды и преобразует их в двоичные файлы, которые могут понять процессоры.

С другой стороны, C / C ++ не выполняется на виртуальных машинах, что удаляет один шаг из цикла выполнения и увеличивает производительность. Он напрямую компилирует читаемый человеком код в двоичные файлы.

Но освободить и выделить переменную на этих языках - огромная боль. В то время как большинство языков программирования обрабатывают выделение и удаление объектов с помощью сборщика мусора или алгоритмов подсчета ссылок.

Go объединяет в себе лучшее из обоих миров. Подобно языкам более низкого уровня, таким как C / C ++, Go является компилируемым языком. Это означает, что производительность почти приближается к языкам более низкого уровня. Он также использует сборку мусора для выделения и удаления объекта. Итак, больше никаких операторов malloc () и free () !!! Прохладный!!!

Код, написанный на Go, легко поддерживать.

Позвольте мне сказать вам одну вещь. В Go нет сумасшедшего синтаксиса программирования, как в других языках. У него очень аккуратный и чистый синтаксис.

Дизайнеры Go в Google имели это в виду, когда создавали язык. Поскольку у Google очень большая кодовая база, и тысячи разработчиков работали над той же самой кодовой базой, код должен быть простым для понимания другими разработчиками, и один сегмент кода должен иметь минимальный побочный эффект на другой сегмент кода. Это сделает код легко поддерживаемым и легко изменяемым.

Go намеренно не учитывает многие особенности современных языков ООП.

  • Никаких классов. Все делится только на пакеты. В Go вместо классов есть только структуры.
  • Не поддерживает наследование. Это упростит изменение кода. В других языках, таких как Java / Python, если класс ABC наследует класс XYZ и вы вносите некоторые изменения в класс XYZ, это может вызвать некоторые побочные эффекты в других классах, наследующих XYZ. Удалив наследование, Go также упрощает понимание кода (поскольку нет суперкласса, на который можно было бы смотреть при просмотре фрагмента кода).
  • Никаких конструкторов.
  • Без аннотаций.
  • Нет дженериков.
  • Без исключений.

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

На графике выше показано, что Go почти так же эффективен, как C / C ++, при этом синтаксис кода остается простым, как у Ruby, Python и других языков. Это беспроигрышная ситуация как для людей, так и для переработчиков !!!

В отличие от других новых языков, таких как Swift, синтаксис Go очень стабилен. Он оставался неизменным с момента первого публичного выпуска 1.0, еще в 2012 году. Это делает его обратно совместимым.

Go поддерживается Google.

  • Я знаю, что это не прямое техническое преимущество. Но Go разработан и поддерживается Google. У Google одна из крупнейших облачных инфраструктур в мире, и она масштабно масштабируется. Go разработан Google для решения своих проблем, связанных с поддержкой масштабируемости и эффективности. Это те же проблемы, с которыми вы столкнетесь при создании собственных серверов.
  • Более того, Go также используется некоторыми крупными компаниями, такими как Adobe, BBC, IBM, Intel и даже Medium. (Источник: https://github.com/golang/go/wiki/GoUsers)

Вывод:

  • Несмотря на то, что Go сильно отличается от других объектно-ориентированных языков, это все тот же зверь. Go обеспечивает высокую производительность, как C / C ++, суперэффективную обработку параллелизма, такую ​​как Java, и интересное программирование, такое как Python / Perl.
  • Если вы не планируете изучать Go, я все равно скажу, что ограничение на количество аппаратных средств вынуждает нас, разработчиков программного обеспечения, писать сверхэффективный код. Разработчик должен разбираться в оборудовании и соответствующим образом оптимизировать свою программу. Оптимизированное программное обеспечение может работать на более дешевом и медленном оборудовании (например, на устройствах IOT) и в целом лучше влиять на взаимодействие с конечным пользователем.

~ Если вам понравилась статья, нажмите 💚 ниже, чтобы ее увидело больше людей! Кроме того, вы можете подписаться на меня в Medium или в M y Blog, чтобы получать новости о будущих статьях на Go !! ~

Кредиты: