Обычно первая версия компилятора написана на другом языке, а затем каждая последующая версия написана на этом языке и скомпилирована с более старой версией. После того, как вы скомпилировали версию x
с версией x-1
, вы можете использовать недавно созданную версию x
для перекомпиляции, используя преимущества любых новых оптимизаций, которые версия представляет; GCC делает свои выпуски таким образом
В самом начале, настоящий первый компилятор этого языка, был написан, конечно, не на этом языке. Очень второй мог быть написан на этом языке. Более того, имея спецификацию языка, вы можете реализовать базовое ядро в бутстрап-компиляторе, а затем написать полностью совместимый компилятор на этом языке, используя подмножество, понятное "бутстрапному" компилятору. Компиляторы второго поколения тоже могут забыть "bootstrap" компилятор.
В какой-то момент вам понадобится компилятор (или интерпретатор), написанный на другом языке. Но он не обязательно должен быть эффективным и может быть сделан на языке, который облегчает разбор и создание прототипов (популярен LISP). После того, как вы использовали его для компиляции "самокомпилятора", вы можете отбросить его и использовать результат.
Это так. Обычно вам нужна загрузочная версия языка, либо скомпилированная, либо интерпретированная из другого языка.
И чтобы еще немного подправить ваш разум, много лет назад я прочитал историю компилятора языка Паскаль, написанного как проект аспиранта. Он был написан на языке Pascal и компилировался встроенным в систему компилятором Pascal. В конце концов, он оказался достаточно хорош, чтобы заменить встроенный в систему компилятор Pascal. К сожалению, они нашли ошибку в генерации кода, но исправление для генератора кода вызвало ошибку в компиляторе, создав плохой компилятор. Для его исправления потребовалось вручную исправлять двоичные файлы установленного компилятора, чтобы затем применить патч к исходному тексту для замены самого компилятора.
Первый проход компилятора обычно пишется на чем-то другом, пока язык не будет достаточно хорошо сформирован, чтобы быть в состоянии компилировать свой собственный компилятор, тогда вы можете перейти к x is written in x.
Это проблема только для самой первой версии. Как только у меня работает компилятор V1.0, я могу написать V2.0 на своем языке и использовать компилятор V1.0 для его компиляции. Затем я могу написать V3.0 и использовать V2.0 для компиляции этой версии, использовать V3.0 для компиляции V4.0 и так далее.