Я разрабатываю язык программирования, и одна из проблем, о которых я думал, - это то, почему языки программирования занимают много времени для компиляции. Предполагаемый C++ занимает много времени, потому что он должен анализировать и компилировать заголовок каждый раз, когда он компилирует файл. Но i -heard-precompiled заголовки занимают столько времени? Я подозреваю, что C++ - не единственный язык, который имеет эту проблему.Почему компиляции занимают так много времени?
ответ
Компиляция представляет собой сложный процесс, который включает в себя довольно много шагов:
- Сканирование/Lexing
- Синтаксический
- Intermediate генерации кода
- Возможно Intermediate оптимизация кода
- Цель генерации кода машины
- Необязательная оптимизация кода машины
(Оставляя в стороне ссылки.)
Естественно, это займет некоторое время, в течение более длительных программ.
Они принимают столько, сколько они берут, и это обычно зависит от того, сколько посторонних вещей вы вводите в свои единицы компиляции. Я бы хотел, чтобы вы вручную скомпилировали их быстрее :-)
При первом компиляции файла у вас не должно быть заголовков. Затем добавьте их по мере необходимости (и проверьте, когда вы закончите, все ли вам нужны).
Другие способы сокращения этого времени - сохранить ваши единицы компиляции небольшими (даже до точки одной функции для каждого файла в крайнем случае) и использовать make-подобный инструмент, чтобы обеспечить вам только то, что нужно.
Некоторые компиляторы (действительно, IDE) выполняют инкрементную компиляцию в фоновом режиме, так что они (почти) всегда близки к полностью скомпилированному.
Язык дизайна оказывают влияние на производительность компилятора. Компиляторы C++ обычно медленнее, чем компиляторы C#, которые имеют много общего с дизайном языка. (Это также зависит от разработчика компилятора, Anders Hejlsberg реализовано C# и является одним из лучших.)
Упрощенная структура «заголовочного файла» на C++ способствует ее более низкой производительности, хотя часто могут использоваться прекомпилированные заголовки. C++ - гораздо более сложный язык, чем C, а компиляторы C поэтому обычно быстрее.
Вы уверены, что Андерс участвовал в реализации компилятора? Я думал, что он больше связан с точкой зрения высокого уровня, а не с кодом компилятора, но это только предположение с моей стороны. – Travis
Я был бы удивлен, если бы он не участвовал, по крайней мере, в части фактической реализации, но я точно не знаю. Тем не менее, он определенно участвует в разработке языка. –
Delphi и Python приходят на ум как исключительно быстрые компиляторы ... – Arafangion
Одна специфическая проблема на C++, которая делает ее ужасно медленной, заключается в том, что, в отличие от любого другого языка, вы не можете анализировать ее независимо от семантического анализа.
Предкомпилированных заголовки путь быстрее, как было известно, по крайней мере, с 1988 года
Обычной причиной для компилятора C или C++ компилятора, чтобы занять много времени, является то, что он должен #include, Preprocess, а затем lex gazillions токенов.
В качестве упражнения вы можете узнать, сколько времени требуется только для запуска cpp над типичной коллекцией файлов заголовков, а затем измерьте, сколько времени потребуется для выхода lex.
gcc -O использует очень эффективную, но несколько медленную технику оптимизации, разработанную Крисом Фрейзером и Джеком Дэвидсоном. Большинство других оптимизаторов могут быть медленными, потому что они предполагают повторную итерацию по довольно крупным структурам данных.
Справедливости ради следует сказать, что попытка удержания большого количества интеллекта в оптимизации является верным способом создания длинных периодов компиляции? Это было мое случайное понимание, но я не желаю делать заявление на одеяло ... – dmckee
Почему оптимизация не может быть использована повторно из предыдущей компиляции, когда только часть кода изменилась? Или, если это можно сделать, как? – HopefullyHelpful
компиляции не необходимости займет много времени: tcc компилирует ANSI C достаточно быстро, чтобы быть полезным в качестве переводчика.
Некоторые вещи, чтобы думать о том:
- Сложность в сканировании и разборе проходов. Предположительно требуя долгого ожидания, будет больно, как и контекстуальные (в отличие от контекстно-свободных) языков.
- Внутреннее представление. Строительство и работа над большим и функциональным АСТ займет некоторое время. Предположительно вы должны использовать простейшее внутреннее представление, которое будет поддерживать функции, которые вы хотите реализовать.
- Оптимизация. Оптимизация суетливая. Вам нужно проверить много разных условий. Вероятно, вы хотите сделать несколько проходов. Все это займет время.
Я думаю, что другие ответы здесь пропустили некоторые важные части ситуации, которая медленно C++ компиляция:
- Компиляция модель, которая сохраняет
.obj
/.o
файлов на диск, считывает их обратно, а затем связывает их - Связывание в целом и плохих медленных линкерами, в частности
- Чрезмерно сложный макрос препроцессора
- Произвольно сложной Тьюрингу системы шаблонов
- Уплотненное и повторное включение исходных файлов, даже с
#pragma once
- пользователя нанесенных фрагментациями, расщепление код в слишком много файлов (вплоть до одной функции в файл, в крайнем случае)
- Bloated или низкое -effort внутренние структуры данных в компиляторе
- Overbloated стандартная библиотека, злоупотребление шаблон
в противоположность этому, они не замедляют C++ компиляции:
- Сканирование/Lexing
- Синтаксический
- Intermediate генерации кода
- Target генерации машинного кода
Как и в сторону, оптимизация является одним из самых больших спадов, но это только замедление вот что фактически необходимо в какой-то мере, а также полностью необязательно.
++ для небольших компиляторов – Thilo