Я Погуглил и ввел по абсолютному адресу вокруг веб-сайта Движения, но я, может казаться, не нахожу объяснение в течение экстраординарного времени изготовления Движения. Они - продукты функций языка (или недоставай этого), высоко оптимизированный компилятор или что-то еще? Я не пытаюсь продвинуть, Идут; мне просто любопытно.
Анализ зависимостей.
Из FAQ по Go :
Go предоставляет модель для программного обеспечения. конструкция, которая делает зависимость анализ прост и позволяет избежать многих накладные расходы на включаемые файлы в стиле C и библиотеки.
Это основная причина быстрой компиляции. И это намеренно.
Просто (своими словами), потому что синтаксис очень прост (для анализа и разбора)
Например, отсутствие наследования типов означает отсутствие проблемного анализа, чтобы выяснить, следует ли новый тип правилам, наложенным базовым типом.
Например, в этом примере кода: "интерфейсы" компилятор не идет и не проверяет, реализует ли предполагаемый тип данный интерфейс при анализе этого типа. Проверка выполняется только до тех пор, пока он не будет использован (и ЕСЛИ он будет использован).
Другой пример, компилятор сообщает вам, если вы объявляете переменную и не используете ее ( или если предполагается, что вы держите возвращаемое значение, а вы этого не делаете )
Следующее не компилируется:
package main
func main() {
var a int
a = 0
}
notused.go:3: a declared and not used
Эти виды принудительных мер и принципов делают результирующий код более безопасным, и компилятору не нужно выполнять дополнительные проверки, которые может сделать программист.
В целом все эти детали делают язык более легким для разбора, что приводит к быстрой компиляции.
Опять же, моими собственными словами.
Я думаю, что Go был разработан параллельно с созданием компилятора, так что они были лучшими друзьями с самого рождения. (IMO)
Эффективность компиляции была основной целью разработки:
Наконец, она должна быть быстрой: создание большого исполняемого файла на одном компьютере должно занимать не более нескольких секунд. Для достижения этих целей требовалось решить ряд лингвистических проблем: выразительная, но легкая система шрифтов; параллелизм и сборка мусора; жесткая спецификация зависимостей; и так далее. FAQ
FAQ по языку довольно интересен в отношении специфических языковых функций, относящихся к синтаксическому анализу:
Во-вторых, язык был разработан таким образом, чтобы его было легко анализировать, и его можно анализировать без таблицы символов.
Хотя большинство из вышеперечисленного верно, есть один очень важный момент, который не был упомянут: Управление зависимостями.
В Go нужно включать только те пакеты, которые вы импортируете напрямую (поскольку те уже импортировали то, что им нужно). Это резко контрастирует с C/C++, где каждый отдельный файл начинает включать x заголовков, которые включают y заголовков и т.д. Итог: Компиляция в Go занимает линейное время по отношению к количеству импортированных пакетов, в то время как в C/C++ - экспоненциальное.
Go был разработан, чтобы быть быстрым, и это видно.
Обратите внимание, что GO - не единственный язык с такими функциями (модули являются нормой для современных языков), но они справились с этим хорошо.
Основная идея компиляции на самом деле очень проста. Парсер с рекурсивным спуском, в принципе, может работать с предельной скоростью ввода-вывода. Генерация кода - это, по сути, очень простой процесс. Таблица символов и базовая система типов не требуют больших вычислений.
Однако замедлить компилятор несложно.
Если есть этап препроцессора с многоуровневыми директивами include , определениями макросов и условной компиляцией, сколь бы полезными они ни были, их несложно загрузить. (Например, я имею в виду файлы заголовков Windows и MFC.) Вот почему необходимы предварительно скомпилированные заголовки.
Что касается оптимизации сгенерированного кода, нет ограничений на то, сколько обработки может быть добавлено к этой фазе.
Я думаю, дело не в том, что компиляторы Go быстрые, а в том, что другие компиляторы медленные.
Компиляторам C и C++ приходится разбирать огромное количество заголовков - например, компиляция C++ "hello world" требует компиляции 18k строк кода, что составляет почти полмегабайта исходников!
$ cpp hello.cpp | wc
18364 40513 433334
Компиляторы Java и C# работают в виртуальной машине, что означает, что прежде чем они смогут что-либо скомпилировать, операционная система должна загрузить всю виртуальную машину, затем они должны быть JIT-компилированы из байткода в нативный код, и все это занимает некоторое время.
Скорость компиляции зависит от нескольких факторов.
Некоторые языки предназначены для быстрой компиляции. Например, язык Pascal был разработан для компиляции с помощью однопроходного компилятора.
Сами компиляторы тоже могут быть оптимизированы. Например, компилятор Turbo Pascal был написан на оптимизированном вручную ассемблере, что, в сочетании с дизайном языка, привело к действительно быстрому компилятору, работающему на оборудовании класса 286. Я думаю, что даже сейчас современные компиляторы Паскаля (например, FreePascal) быстрее компиляторов Go.