Почему компиляции занимают так много времени?

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

Ответ 1

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

Ответ 2

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

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

(Оставляя ссылку на ссылку.)

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

Ответ 3

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

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

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

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

Ответ 4

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

О чем подумать:

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

Ответ 5

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

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

Ответ 6

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

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

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

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