02.11.2020
За последние пару лет произошёл мощный рост нового языка программирования Go или Golang. Сегодня Максим Свинин, наставник IT-квантума расскажет про текущее состояние компьютерного аппаратного и программного обеспечения. Зачем нам такой новый язык, как Go. Ведь если нет проблем, то и решения не нужны, верно?
Ограничения железа. Закон Мура не работает?
Ниже на графике, вы можете увидеть сравнительный график роста вычислительной мощности по времени.
По этому графику можно понять, что однопоточная производительность и частота процессора оставалась стабильной почти десятилетие. Так происходит потому, что в более меньших масштабах начинают проявляться квантовые свойства объекта, а добавление большего количества транзисторов приводит к дополнительным расходам, и количество транзисторов, которые вы можете добавить за один доллар стремительно начинает падать.
Поэтому, для решения проблемы выше производители начали добавлять больше ядер в процессор. На текущий день нам доступно 4-х , 8-ми и даже 16 ядерные процессоры. Также положено начало гиперпоточности (Hyper-Threading). Добавили больше кэша в процессор для увеличения производительности.
Но решения выше имеют свои ограничения. Мы не можем добавить больше кэша в процессор, поскольку кэш имеет физические ограничения: чем больше кэш, тем медленнее он становится. Добавление большего количества ядер в процессор тоже имеет свою цену. К тому же, это невозможно делать до бесконечности. Все эти многоядерные процессоры могут запускать множество потоков одновременно, и это придаёт нашей картине многозадачность.
Итак, раз мы не можем полагаться на улучшение аппаратной части, то единственный выход из этой ситуации — это более эффективное программное обеспечение. Но, к сожалению, современные языки программирования не так эффективны.
В Go есть горутины !!
Как говорилось ранее, производители аппаратного оборудования добавляют всё больше ядер в процессор, чтобы увеличить его производительность. Все дата-центры запускаются на этих процессорах и нам стоит ожидать увеличения количества ядер в ближайшие годы. Более того, современные приложения используют множество микросервисов для поддержки соединений с базой данных, очередей сообщений и кэширования. Таким образом, разрабатываемые нами программное обеспечение и языки программирования должны легко поддерживать многозадачность, и они должны быть масштабируемыми при увеличении количества ядер.
Но большинство современных языков программирования (такие, как Java, Python) пришли из однопоточной среды разработки 90-х. Хотя они и поддерживают многопоточность, но реальная проблема связана с одновременным выполнением, блокированием потока, состоянием гонки и тупиковой ситуацией. Эти вещи осложняют создание многопоточного приложения на вышеназванных языках.
Например, создание нового потока в Java неэффективно использует память. Поскольку каждый поток потребляет примерно 1МБ памяти из кучи (динамически распределяемой памяти), и в итоге, если вы запустите тысячи потоков, то они окажут колоссальное давление на память и могут вызвать завершение работы приложения из-за её нехватки. К тому же, если вы хотите, чтобы два или более потока могли общаться между собой, то сделать это будет довольно трудно.
С другой стороны, Go был выпущен в 2009 году, когда многоядерные процессоры были уже доступны. Вот почему Go был создан с учётом многозадачности. Go использует горутины вместо потоков. Они потребляют почти 2КБ памяти из кучи. Поэтому вы можете прокручивать хоть миллионы горутин в любое время.
Другие преимущества горутин:
Одно из самых значимых преимуществ использования С/С++ вместо современных языков, типа Java/Python, это их производительность. Потому что С/С++ компилируются, а не интерпретируются.
Процессоры понимают только двоичный код. Как правило, когда вы пишете приложение на Java или других, основанных на JVM, языках, то при компиляции вашего проекта, он компилируется с человекопонятного кода в байт-код, который понятен для JVM или другой виртуальной машине, которая запускается поверх ОС. При выполнении, VM интерпретирует этот байт-код и конвертирует его в двоичный код, понятный процессору.
С другой стороны находятся С/С++, которые не используют виртуальные машины, и это позволяет убрать один этап из схемы выше, повысив при этом производительность. Происходит прямая компиляция человекопонятного кода в двоичный.
Но очистка и распределение переменных в этих языках — та ещё боль. В то же время, большинство языков программирования обрабатывают распределение и удаление объектов, используя сборщик мусора и алгоритмы подсчёта ссылок.
Go вобрал лучшее из обоих миров:
Go намеренно не содержит множество особенностей ООП языков:
Вышеназванные изменения отличают Go от остальных языков и это делает программирование на нём не похожим на программирование на других языках.
Заключение
Хотя Go отличен от других ООП языков, это всё тот же зверь. Go предоставляет вам такую же высокую производительность, как в С/C++, высокоэффективную обработку многозадачности, как в Java и такое же удобство написания кода, как в Python/Perl.
Вам понравилось? Расскажите о своем опыте своим друзьям в социальных сетях. Пусть им понравится тоже!
Подпишитесь на нашу рассылку
Остались вопросы по качеству обучения?
Вы можете задать их любым удобным для вас способом:
Анкета по оценке удовлетворенности качеством оказания образовательных услуг общеобразовательной организацией
Оценить качествоНажимая кнопку «Подписаться», я даю согласие на обработку моих персональных данных согласно 152-ФЗ