Go under the hood
Go: Under the Hood

Глава 3 Жизнь программы

An adequate bootstrap is a contradiction in terms.
-- Alan J. Perlis, "Epigrams on Programming"

Функция main, которую пишет разработчик, — это никогда не та точка, с которой программа начинает выполнение на самом деле. Чтобы строка исходного кода превратилась в работающий процесс, ей предстоит пройти длинную цепочку: команда go разбивает сборку на граф действий и передаёт его компилятору и компоновщику, сам компилятор должен быть собран из предыдущей версии Go (бутстрап), компоновщик вшивает весь рантайм в бинарный файл, и лишь после того, как операционная система загрузит его, ассемблерная точка входа создаёт первую горутину — только тогда main.main получает управление, а в момент возврата из неё она уносит с собой весь процесс. Эта глава последовательно проходит всю эту линию жизни от начала до конца, подробно объясняя, что происходит до и после main, не упуская ни одного звена. Она служит одновременно и главной точкой входа к последующим частям книги (рантайм, конкурентность, память, инструментарий), и отправной точкой для понимания фундаментального свойства Go — того, что рантайм и пользовательский код находятся в одном бинарном файле.