Как действительно Идет компиляция так быстро?

Я Погуглил и ввел по абсолютному адресу вокруг веб-сайта Движения, но я, может казаться, не нахожу объяснение в течение экстраординарного времени изготовления Движения. Они - продукты функций языка (или недоставай этого), высоко оптимизированный компилятор или что-то еще? Я не пытаюсь продвинуть, Идут; мне просто любопытно.

208
задан 3 revs, 3 users 100% 19 August 2016 в 16:40
поделиться

8 ответов

Анализ зависимостей.

Из FAQ по Go :

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

Это основная причина быстрой компиляции. И это намеренно.

184
ответ дан 23 November 2019 в 04:41
поделиться

Просто (своими словами), потому что синтаксис очень прост (для анализа и разбора)

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

Например, в этом примере кода: "интерфейсы" компилятор не идет и не проверяет, реализует ли предполагаемый тип данный интерфейс при анализе этого типа. Проверка выполняется только до тех пор, пока он не будет использован (и ЕСЛИ он будет использован).

Другой пример, компилятор сообщает вам, если вы объявляете переменную и не используете ее ( или если предполагается, что вы держите возвращаемое значение, а вы этого не делаете )

Следующее не компилируется:

package main
func main() {
    var a int 
    a = 0
}
notused.go:3: a declared and not used

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

В целом все эти детали делают язык более легким для разбора, что приводит к быстрой компиляции.

Опять же, моими собственными словами.

7
ответ дан 23 November 2019 в 04:41
поделиться

Я думаю, что Go был разработан параллельно с созданием компилятора, так что они были лучшими друзьями с самого рождения. (IMO)

3
ответ дан 23 November 2019 в 04:41
поделиться

Эффективность компиляции была основной целью разработки:

Наконец, она должна быть быстрой: создание большого исполняемого файла на одном компьютере должно занимать не более нескольких секунд. Для достижения этих целей требовалось решить ряд лингвистических проблем: выразительная, но легкая система шрифтов; параллелизм и сборка мусора; жесткая спецификация зависимостей; и так далее. FAQ

FAQ по языку довольно интересен в отношении специфических языковых функций, относящихся к синтаксическому анализу:

Во-вторых, язык был разработан таким образом, чтобы его было легко анализировать, и его можно анализировать без таблицы символов.

33
ответ дан 23 November 2019 в 04:41
поделиться

Хотя большинство из вышеперечисленного верно, есть один очень важный момент, который не был упомянут: Управление зависимостями.

В Go нужно включать только те пакеты, которые вы импортируете напрямую (поскольку те уже импортировали то, что им нужно). Это резко контрастирует с C/C++, где каждый отдельный файл начинает включать x заголовков, которые включают y заголовков и т.д. Итог: Компиляция в Go занимает линейное время по отношению к количеству импортированных пакетов, в то время как в C/C++ - экспоненциальное.

25
ответ дан 23 November 2019 в 04:41
поделиться

Go был разработан, чтобы быть быстрым, и это видно.

  1. Управление зависимостями: нет файла заголовка, вам просто нужно посмотреть пакеты, которые импортируются напрямую (не нужно беспокоиться о том, что они импортируют), поэтому у вас есть линейные зависимости.
  2. Грамматика: грамматика языка проста, поэтому ее легко анализировать. Несмотря на то, что количество функций уменьшено, сам код компилятора ограничен (несколько путей).
  3. Перегрузка недопустима: вы видите символ, вы знаете, к какому методу он относится.
  4. Параллельная компиляция Go упрощается, поскольку каждый пакет может быть скомпилирован независимо.

Обратите внимание, что GO - не единственный язык с такими функциями (модули являются нормой для современных языков), но они справились с этим хорошо.

12
ответ дан 23 November 2019 в 04:41
поделиться

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

Однако замедлить компилятор несложно.

Если есть этап препроцессора с многоуровневыми директивами include , определениями макросов и условной компиляцией, сколь бы полезными они ни были, их несложно загрузить. (Например, я имею в виду файлы заголовков Windows и MFC.) Вот почему необходимы предварительно скомпилированные заголовки.

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

9
ответ дан 23 November 2019 в 04:41
поделиться

Я думаю, дело не в том, что компиляторы Go быстрые, а в том, что другие компиляторы медленные.

Компиляторам C и C++ приходится разбирать огромное количество заголовков - например, компиляция C++ "hello world" требует компиляции 18k строк кода, что составляет почти полмегабайта исходников!

$ cpp hello.cpp | wc
  18364   40513  433334

Компиляторы Java и C# работают в виртуальной машине, что означает, что прежде чем они смогут что-либо скомпилировать, операционная система должна загрузить всю виртуальную машину, затем они должны быть JIT-компилированы из байткода в нативный код, и все это занимает некоторое время.

Скорость компиляции зависит от нескольких факторов.

Некоторые языки предназначены для быстрой компиляции. Например, язык Pascal был разработан для компиляции с помощью однопроходного компилятора.

Сами компиляторы тоже могут быть оптимизированы. Например, компилятор Turbo Pascal был написан на оптимизированном вручную ассемблере, что, в сочетании с дизайном языка, привело к действительно быстрому компилятору, работающему на оборудовании класса 286. Я думаю, что даже сейчас современные компиляторы Паскаля (например, FreePascal) быстрее компиляторов Go.

73
ответ дан 23 November 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: