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