Почему компилятору Go нужно включать только те пакеты, которые вы импортируете напрямую? - PullRequest
0 голосов
/ 17 февраля 2019

Я использовал Go и читал в некоторых местах, что компилятор Go должен включать в себя только пакеты, которые вы импортируете напрямую из main.
В результате время, необходимое для разрешения зависимости, является линейным, так какпо сравнению с C ++, где его экспонента.Как это работает?
Если main импортирует пакет alpha, который, в свою очередь, импортирует пакет beta, то компилятору Go не потребуется компилировать все дерево?

1 Ответ

0 голосов
/ 17 февраля 2019

Компилятор Go сначала компилирует один пакет в один объектный файл.На этом этапе ему нужно только разрешить все import s, которые он находит в пакете, который он компилирует.Для объектного файла вашего пакета есть только обращения к одному и тому же пакету или прямой импорт, поэтому здесь нет проблем.Отдельный этап связывания связывает все объектные файлы вместе.Это вполне объяснимо в документе пакета компиляции :

Компиляция, обычно вызываемая как «go tool compile», компилирует один пакет Go, содержащий файлы, названные вкомандная строка.Затем он записывает один объектный файл с именем для базового имени первого исходного файла с суффиксом .o.Затем объектный файл можно объединить с другими объектами в архив пакета или передать непосредственно компоновщику («перейти по ссылке на инструмент»).При вызове с -pack компилятор записывает архив напрямую, минуя промежуточный объектный файл.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...