2009-02-26 4 views
14

Я разрабатываю язык программирования, и одна из проблем, о которых я думал, - это то, почему языки программирования занимают много времени для компиляции. Предполагаемый C++ занимает много времени, потому что он должен анализировать и компилировать заголовок каждый раз, когда он компилирует файл. Но i -heard-precompiled заголовки занимают столько времени? Я подозреваю, что C++ - не единственный язык, который имеет эту проблему.Почему компиляции занимают так много времени?

ответ

14

Компиляция представляет собой сложный процесс, который включает в себя довольно много шагов:

  • Сканирование/Lexing
  • Синтаксический
  • Intermediate генерации кода
  • Возможно Intermediate оптимизация кода
  • Цель генерации кода машины
  • Необязательная оптимизация кода машины

(Оставляя в стороне ссылки.)

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

2

Они принимают столько, сколько они берут, и это обычно зависит от того, сколько посторонних вещей вы вводите в свои единицы компиляции. Я бы хотел, чтобы вы вручную скомпилировали их быстрее :-)

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

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

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

+0

++ для небольших компиляторов – Thilo

4

Язык дизайна оказывают влияние на производительность компилятора. Компиляторы C++ обычно медленнее, чем компиляторы C#, которые имеют много общего с дизайном языка. (Это также зависит от разработчика компилятора, Anders Hejlsberg реализовано C# и является одним из лучших.)

Упрощенная структура «заголовочного файла» на C++ способствует ее более низкой производительности, хотя часто могут использоваться прекомпилированные заголовки. C++ - гораздо более сложный язык, чем C, а компиляторы C поэтому обычно быстрее.

+0

Вы уверены, что Андерс участвовал в реализации компилятора? Я думал, что он больше связан с точкой зрения высокого уровня, а не с кодом компилятора, но это только предположение с моей стороны. – Travis

+0

Я был бы удивлен, если бы он не участвовал, по крайней мере, в части фактической реализации, но я точно не знаю. Тем не менее, он определенно участвует в разработке языка. –

+0

Delphi и Python приходят на ум как исключительно быстрые компиляторы ... – Arafangion

16

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

7

Предкомпилированных заголовки путь быстрее, как было известно, по крайней мере, с 1988 года

Обычной причиной для компилятора C или C++ компилятора, чтобы занять много времени, является то, что он должен #include, Preprocess, а затем lex gazillions токенов.

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

gcc -O использует очень эффективную, но несколько медленную технику оптимизации, разработанную Крисом Фрейзером и Джеком Дэвидсоном. Большинство других оптимизаторов могут быть медленными, потому что они предполагают повторную итерацию по довольно крупным структурам данных.

+0

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

+0

Почему оптимизация не может быть использована повторно из предыдущей компиляции, когда только часть кода изменилась? Или, если это можно сделать, как? – HopefullyHelpful

6

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

Некоторые вещи, чтобы думать о том:

  1. Сложность в сканировании и разборе проходов. Предположительно требуя долгого ожидания, будет больно, как и контекстуальные (в отличие от контекстно-свободных) языков.
  2. Внутреннее представление. Строительство и работа над большим и функциональным АСТ займет некоторое время. Предположительно вы должны использовать простейшее внутреннее представление, которое будет поддерживать функции, которые вы хотите реализовать.
  3. Оптимизация. Оптимизация суетливая. Вам нужно проверить много разных условий. Вероятно, вы хотите сделать несколько проходов. Все это займет время.
0

Я думаю, что другие ответы здесь пропустили некоторые важные части ситуации, которая медленно C++ компиляция:

  • Компиляция модель, которая сохраняет .obj/.o файлов на диск, считывает их обратно, а затем связывает их
  • Связывание в целом и плохих медленных линкерами, в частности
  • Чрезмерно сложный макрос препроцессора
  • Произвольно сложной Тьюрингу системы шаблонов
  • Уплотненное и повторное включение исходных файлов, даже с #pragma once
  • пользователя нанесенных фрагментациями, расщепление код в слишком много файлов (вплоть до одной функции в файл, в крайнем случае)
  • Bloated или низкое -effort внутренние структуры данных в компиляторе
  • Overbloated стандартная библиотека, злоупотребление шаблон

в противоположность этому, они не замедляют C++ компиляции:

  • Сканирование/Lexing
  • Синтаксический
  • Intermediate генерации кода
  • Target генерации машинного кода

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