<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Глава 3 Жизнь программы on Go: Under the Hood</title>
    <link>/ru/part1overview/ch03life/</link>
    <description>Recent content in Глава 3 Жизнь программы on Go: Under the Hood</description>
    <generator>Hugo</generator>
    <language>ru</language>
    <atom:link href="/ru/part1overview/ch03life/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>3.1 Начинаем с команды `go`</title>
      <link>/ru/part1overview/ch03life/cmd/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/ru/part1overview/ch03life/cmd/</guid>
      <description>&lt;h1 id=&#34;31-начинаем-с-команды-go&#34;&gt;3.1 Начинаем с команды &lt;code&gt;go&lt;/code&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Жизненный цикл программы на Go начинается с запуска команды &lt;code&gt;go&lt;/code&gt;. Команды &lt;code&gt;go build&lt;/code&gt;, &lt;code&gt;go test&lt;/code&gt;&#xA;и &lt;code&gt;go run&lt;/code&gt;, которые читатель набирает каждый день, на первый взгляд лишь «превращают исходный код&#xA;в бинарный файл», но за ними скрывается факт, который часто понимают неверно: &lt;code&gt;go&lt;/code&gt; сама по себе&#xA;не является компилятором. Это &lt;strong&gt;оркестратор сборки&lt;/strong&gt;, который разбивает единый процесс на множество&#xA;отдельных шагов, определяет их порядок и степень параллелизма, а затем последовательно вызывает&#xA;настоящие инструменты: компилятор &lt;code&gt;compile&lt;/code&gt; (&lt;a href=&#34;.././compile&#34;&gt;3.2&lt;/a&gt;), ассемблер &lt;code&gt;asm&lt;/code&gt; и линкер &lt;code&gt;link&lt;/code&gt;&#xA;(&lt;a href=&#34;.././link&#34;&gt;3.4&lt;/a&gt;). В этом разделе мы сначала проясним саму схему оркестрации — она задаёт&#xA;структуру для всех последующих разделов: поняв, как &lt;code&gt;go&lt;/code&gt; декомпозирует сборку в граф и как&#xA;использует кэш на основе содержимого для устранения повторной работы, читатель получит опору&#xA;для погружения в детали компиляции и линковки.&lt;/p&gt;</description>
    </item>
    <item>
      <title>3.2 Конвейер компиляции Go</title>
      <link>/ru/part1overview/ch03life/compile/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/ru/part1overview/ch03life/compile/</guid>
      <description>&lt;h1 id=&#34;32-конвейер-компиляции-go&#34;&gt;3.2 Конвейер компиляции Go&lt;/h1&gt;&#xA;&lt;p&gt;В разделе &lt;a href=&#34;.././cmd&#34;&gt;3.1&lt;/a&gt; было показано, что реальную работу &lt;code&gt;go build&lt;/code&gt; выполняют две программы — &lt;code&gt;compile&lt;/code&gt; и &lt;code&gt;link&lt;/code&gt;. Этот раздел фокусируется на &lt;code&gt;compile&lt;/code&gt; и прослеживает полный путь от одного исходного файла &lt;code&gt;.go&lt;/code&gt; до одного объектного файла &lt;code&gt;.o&lt;/code&gt;: что получает каждая стадия, что она порождает и почему работа разделена именно так. Этот раздел представляет собой &lt;strong&gt;панораму&lt;/strong&gt; конвейера компиляции. Внутреннее устройство каждой стадии (как устроена грамматика, какой алгоритм используется для проверки типов, правила оптимизации SSA) раскрывается в &lt;a href=&#34;../../../part5toolchain/ch15compile/readme&#34;&gt;главе 15&lt;/a&gt;. Здесь мы лишь выстраиваем их в единую линию и указываем на две сквозные темы.&lt;/p&gt;</description>
    </item>
    <item>
      <title>3.3 Бутстрап языка</title>
      <link>/ru/part1overview/ch03life/bootstrap/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/ru/part1overview/ch03life/bootstrap/</guid>
      <description>&lt;h1 id=&#34;33-бутстрап-языка&#34;&gt;3.3 Бутстрап языка&lt;/h1&gt;&#xA;&lt;p&gt;Один вопрос звучит как парадокс: компилятор, ассемблер, компоновщик и рантайм Go сегодня написаны на Go, так откуда же взялась первая программа, способная скомпилировать Go? Без компилятора Go — как скомпилировать компилятор Go? Это и есть &lt;strong&gt;бутстрап&lt;/strong&gt; (bootstrapping). Он представляет собой одновременно и классическую дилемму курицы и яйца, и конкретный инженерный эпизод из истории инструментария Go, который можно пересказать с точностью до деталей. В этом разделе даётся ответ на три вопроса: как это яйцо было высижено впервые; как после бутстрапа работает цепочка сборки новой версии Go и почему требования к версии бутстрапа растут год от года; и наконец, почему язык, который «реализует себя средствами самого себя», заслуживает серьёзного отношения.&lt;/p&gt;</description>
    </item>
    <item>
      <title>3.4 Компоновка модулей</title>
      <link>/ru/part1overview/ch03life/link/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/ru/part1overview/ch03life/link/</guid>
      <description>&lt;h1 id=&#34;34-компоновка-модулей&#34;&gt;3.4 Компоновка модулей&lt;/h1&gt;&#xA;&lt;p&gt;Компилятор (&lt;a href=&#34;.././compile&#34;&gt;3.2&lt;/a&gt;) преобразует каждый пакет в объектный файл, но объектный файл сам по себе не может быть выполнен. Объектные файлы по-прежнему ссылаются на функции и переменные друг друга, адреса ещё не зафиксированы, а поддержка рантайма отсутствует. Сборка этих фрагментов в цельную программу, пригодную для загрузки и исполнения, — задача &lt;strong&gt;компоновщика&lt;/strong&gt; (&lt;code&gt;cmd/link&lt;/code&gt;, обычно вызываемого через &lt;code&gt;go build&lt;/code&gt; как &lt;code&gt;go tool link&lt;/code&gt;). В этом разделе рассматривается, что делает компоновщик и какие решения Go принимает в области компоновки, — именно они объясняют, почему Go-программа так часто представляет собой единственный самодостаточный файл, который «просто работает после копирования на целевую машину».&lt;/p&gt;</description>
    </item>
    <item>
      <title>3.5 Начальная загрузка Go-программы</title>
      <link>/ru/part1overview/ch03life/boot/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/ru/part1overview/ch03life/boot/</guid>
      <description>&lt;h1 id=&#34;35-начальная-загрузка-go-программы&#34;&gt;3.5 Начальная загрузка Go-программы&lt;/h1&gt;&#xA;&lt;p&gt;Функция &lt;code&gt;main&lt;/code&gt;, которую пишет читатель, не является первой инструкцией программы. Когда&#xA;операционная система передаёт управление исполняемому файлу Go, первым начинает работу рантайм:&#xA;он должен разметить стек выполнения на главном потоке, привязать локальное хранилище потока&#xA;(TLS), определить количество ядер CPU и размер физической страницы памяти, последовательно&#xA;пробудить аллокатор памяти, сборщик мусора и шедулер, и лишь затем создать горутину,&#xA;несущую &lt;code&gt;main&lt;/code&gt;, и передать её в цикл планирования для запуска. Иначе говоря, бинарный файл Go&#xA;содержит внутри себя миниатюрную операционную систему (&lt;a href=&#34;../../ch01intro/go&#34;&gt;1.2&lt;/a&gt;), которая&#xA;запускается раньше пользовательского кода. В этом разделе мы пройдём всю цепочку начальной&#xA;загрузки от начала до конца — от точки входа, определённой операционной системой, до момента&#xA;планирования первой горутины, — чтобы ясно увидеть, что происходит «до &lt;code&gt;main&lt;/code&gt;».&lt;/p&gt;</description>
    </item>
    <item>
      <title>3.6 Жизнь и смерть главной горутины</title>
      <link>/ru/part1overview/ch03life/main/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/ru/part1overview/ch03life/main/</guid>
      <description>&lt;h1 id=&#34;36-жизнь-и-смерть-главной-горутины&#34;&gt;3.6 Жизнь и смерть главной горутины&lt;/h1&gt;&#xA;&lt;p&gt;В &lt;a href=&#34;.././boot&#34;&gt;3.5&lt;/a&gt;, после того как &lt;code&gt;schedinit&lt;/code&gt; собрал фундамент рантайма, прямого вызова &lt;code&gt;runtime.main&lt;/code&gt; не происходит. Вместо этого адрес точки входа этой функции помещается на стек, передаётся в &lt;code&gt;newproc&lt;/code&gt; для создания первой горутины, а затем &lt;code&gt;mstart&lt;/code&gt; запускает цикл планирования и выбирает эту горутину для выполнения. Детали планирования оставлены для &lt;a href=&#34;/ru/part3concurrency/ch09sched/&#34;&gt;9 Шедулер&lt;/a&gt;. В данном разделе внимание сосредоточено на одном конкретном моменте: &lt;strong&gt;первая горутина уже запущена и готова выполнить &lt;code&gt;runtime.main&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
