Go under the hood
Go: Under the Hood

Введение

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

Слово к читателю

Читатель может задаться вопросом: дизайн всегда эволюционирует, исходный код всегда меняется, так зачем тратить усилия на изучение исходного кода, с которым вы, возможно, никогда не столкнетесь в реальной работе? Автор считает иначе, потому что «программная инженерия происходит тогда, когда код читает кто-то другой, а не его первоначальный автор». В процессе чтения исходного кода, помимо углубления нашего понимания самого языка, важнее понять фундаментальные принципы, стоящие за конкретным дизайном, а также инженерные решения, практики и методы реализации, которые возникли, когда другие реализовывали этот дизайн. Код всегда можно выбросить и переписать, но принципы «живут вечно».

Идея создания этой книги состоит в том, чтобы охватить все аспекты языка Go. В них входят компоненты среды выполнения (runtime) Go, с которыми напрямую взаимодействует пользовательский код, набор инструментов (toolchain), тесно связанный с ключевыми особенностями языка, многие важные стандартные библиотеки и так далее. В некоторых случаях эта книга обсуждает различия реализации на разных платформах, но основной акцент сделан на Linux amd64.

Предварительные требования

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

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

Если вас беспокоит высокий порог вхождения книги или вам кажется сложным читать главы, посвященные планировщику, “краже” задач (stealing) и памяти, ознакомьтесь с разделом Как читать эту книгу — там даны конкретные советы по выбору отправной точки в зависимости от вашего опыта и по чтению сложных глав в два этапа.

О текущем издании

Содержимое этой книги было систематически переписано и переработано с ориентацией на Go 1.26, охватив шесть основных частей: панорама и история, особенности языка, конкурентность, память, компилятор и набор инструментов, геретогенные вычисления и ИИ. Каждый раздел по мере возможности возвращается к цепочке «проблема, дизайн, эволюция, компромиссы, реализация» и проверяется по исходному коду Go и первичным документам по проектированию.

Даже с учетом этого исходный код продолжает эволюционировать, и в книге неизбежно будут упущения или устаревший материал по сравнению с новыми версиями. Если во время чтения вы начнете подозревать, что какой-то отрывок ошибочен, приглашаем вас открыть Issue или Pull Request в репозитории GitHub, и мы продолжим вносить правки.