+7 (900) 029-50-10 ДЮТТ
+7 (904) 808-60-10 Кванториум Челябинск
+7 (3519) 33-07-37 Кванториум Магнитогорск
+7 (351) 369-08-13 Кванториум Златоуст
+7 (35163) 2-45-85 Кванториум Троицк
+7 (351) 394-33-03 Кванториум Копейск
+7 (35160) 2-25-76 Кванториум Пласт
+7 (35134) 4-22-81 IT-Куб Южноуральск
+7 951 806 3486 IT-Куб Сатка
+7 (3519) 33-08-08 IT-Куб Магнитогорск
+7 951-787-67-82 IT-Куб Кыштым
+7 (35146) 92 716 IT-Куб Снежинск
+7 9000 670 186 IT-Куб Миасс
+7 (351) 218-11-16 IT-Куб Челябинск
+7 (919) 111-20-76 IT-Куб Трехгорный

Go или не Go. Зачем Google создали ещё один язык программирования?

Go или не Go. Зачем Google создали ещё один язык программирования?

За последние пару лет произошёл мощный рост нового языка программирования Go или Golang. Сегодня Максим Свинин, наставник IT-квантума расскажет про текущее состояние компьютерного аппаратного и программного обеспечения. Зачем нам такой новый язык, как Go. Ведь если нет проблем, то и решения не нужны, верно?

Ограничения железа. Закон Мура не работает?

Ниже на графике, вы можете увидеть сравнительный график роста вычислительной мощности по времени.

Go или не Go. Зачем Google создали ещё один язык программирования?

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

Поэтому, для решения проблемы выше производители начали добавлять больше ядер в процессор. На текущий день нам доступно 4-х , 8-ми и даже 16 ядерные процессоры. Также положено начало гиперпоточности (Hyper-Threading). Добавили больше кэша в процессор для увеличения производительности.

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

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

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

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

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

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

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

Go или не Go. Зачем Google создали ещё один язык программирования?

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

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

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

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

Go или не Go. Зачем Google создали ещё один язык программирования?

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

Go или не Go. Зачем Google создали ещё один язык программирования?

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

Go вобрал лучшее из обоих миров:

  • Как и низкоуровневые языки, типа С/С++, Go компилируемый язык. Это подразумевает производительность, близкую к низкоуровневым языкам. Он также имеет свой сборщик мусора для распределения и удаления объектов.
  • Код, написанный на Go, легко поддерживать.
  • Позвольте мне сказать вам одну вещь. У Go нет такого безумного синтаксиса, как в других языках, — всё очень аккуратно и чисто.Разработчики Go в Google имели это ввиду, когда создавали его. Ввиду того, что у Google огромная кодовая база и над ней трудятся тысячи разработчиков, то код должен быть простым для понимания остальными разработчиками, и один участок кода должен иметь минимум побочных эффектов на другие участки. Это делает код более простым для поддержки и внесения изменений.

Go намеренно не содержит множество особенностей ООП языков:

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

Вышеназванные изменения отличают Go от остальных языков и это делает программирование на нём не похожим на программирование на других языках.

Заключение

Хотя Go отличен от других ООП языков, это всё тот же зверь. Go предоставляет вам такую же высокую производительность, как в С/C++, высокоэффективную обработку многозадачности, как в Java и такое же удобство написания кода, как в Python/Perl.

 

Написать сообщение

Оцените от 1 до 5

Вам понравилось? Расскажите о своем опыте своим друзьям в социальных сетях. Пусть им понравится тоже!

Подпишитесь на нашу рассылку

Подписаться

Остались вопросы по качеству обучения?

Вы можете задать их любым удобным для вас способом:

Приемная директора

Обратиться

Позвонив по телефону +7 9000 295 020

Отправить на e-mail pismadir@robo74.ru

Анкета по оценке удовлетворенности качеством оказания образовательных услуг общеобразовательной организацией

Оценить качество

Нажимая кнопку «Подписаться», я даю согласие на обработку моих персональных данных согласно 152-ФЗ

Решаем вместе
Есть предложения по организации учебного процесса или знаете, как сделать школу лучше?