Я разрабатываю язык программирования, и одна из проблем, о которых я думал, - это то, почему языки программирования занимают много времени для компиляции. Предполагаемый С++ занимает много времени, потому что он должен анализировать и компилировать заголовок каждый раз, когда он компилирует файл. Но я -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) выполняют инкрементную компиляцию в фоновом режиме, чтобы они (почти) всегда были близки к полностью скомпилированным.