Я хочу знать, как спроектировать компилятор, который очень и очень быстро компилируется.
Во-первых, позвольте мне избежать некоторых очевидных недоразумений в моем вопросе:
Я не говорю о скорости кода, создаваемого компилятором. Уже есть много ресурсов, доступных для обучения, как оптимизировать сгенерированный код. У меня возникают проблемы с поиском информации о том, как сделать компилятор быстрым.
Меня также не интересует обсуждение того, почему компиляторы C ++ обычно работают медленнее, чем компиляторы Java (например). Мне интересно, какие методы могут быть использованы для ускорения компилятора для любого языка.
Я также не хочу слышать о распределенных системах компиляции, таких как Microsoft Incredibuild или Unix distcc. Эти системы не дают вам более быстрых компиляторов, они просто дают вам больше компиляторов. Что, безусловно, полезно, но это не тот вопрос, который я задаю. Я хочу знать, как разработать быстрый компилятор для одного процессора.
И не ccache - ответ, который я ищу. Это система, которая позволяет вам вообще не использовать компилятор, но она не делает компилятор быстрее. Опять же, это полезно; опять же, это не тот вопрос, который я задаю.
Надеюсь, мой вопрос теперь совершенно ясен. Но, возможно, какая-то история сделает это еще яснее.
Компиляторы С раньше работали очень медленно. Затем, в 1986 году, THINK Technologies представила Lightspeed C для Macintosh и почти мгновенно компилировала программы. Lightspeed C был , поэтому намного быстрее, чем все другие компиляторы C, что вряд ли можно было сравнить. (Возможно, Lightspeed C не был первым из нового поколения молниеносных компиляторов, но он был первым в моем опыте. Turbo Pascal появился ранее [1983], но у меня не было опыта с этим, поэтому я не знаю, как по сравнению, по скорости.)
С тех пор появилось много быстрых компиляторов. Кажется, что в 1980-х годах произошел некоторый квантовый скачок в технологии компиляции, и , в частности , - это то, что я пытаюсь понять. Каким был прорыв?
Ответ может быть таким простым: в таких средах разработки, как Lightspeed и Turbo, встроенный редактор уже имеет исходный код в ОЗУ. Если компилятор оперирует этими данными, он устраняет дисковый ввод-вывод, который является самой медленной частью любого компилятора. Это, вероятно, очень важный вклад в улучшение скорости, если размер исходного кода мал по сравнению с объемом памяти. (В те времена размеры ОЗУ были намного меньше, но тогда были типичные размеры программ.)
Это так? Или были вовлечены другие важные нововведения? И были ли важные улучшения в скорости компилятора с тех пор?