Обычно первая версия компилятора написана на другом языке, а затем каждая последующая версия написана на этом языке и скомпилирована с более старой версией. После того, как вы скомпилировали версию x с версией x-1, вы можете использовать недавно созданную версию x для перекомпиляции, используя преимущества любых новых оптимизаций, представленных в этой версии; GCC делает свои релизы таким образом
personMichael Mrozekschedule08.06.2010
comment
+1 Я построил простой интерпретатор Лиспа на JAVA.
- personAchilles; 08.06.2010
comment
так ... почему нельзя просто использовать первую версию компилятора? Зачем вам двухуровневый компилятор?
- personfroadie; 08.06.2010
comment
@froadie Вы имеете в виду, почему бы не скомпилировать каждую версию с версией 1? Обычно новые версии компилятора генерируют лучший машинный код, чем предыдущие версии, поэтому сборка с использованием новейшей версии сделает сам компилятор максимально быстрым и эффективным. Кроме того, если сам язык меняется, и вы хотите использовать эти новые функции в исходном коде компилятора, вам нужно будет выполнить сборку с более новой версией.
- personMichael Mrozek; 09.06.2010
comment
@MichaelMrozek, это круто, ты хочешь сказать, что все языки происходят от ассемблера?
- personCMCDragonkai; 28.05.2014
Это. Обычно вам нужна начальная версия языка, скомпилированная или интерпретированная с другого языка.
И чтобы немного поразить ваш разум, много лет назад я прочитал историю компилятора Паскаля, написанного в качестве проекта для аспирантов. Он написан на Паскале и скомпилирован с помощью встроенного в систему компилятора Паскаля. В конце концов, этого было достаточно, чтобы заменить встроенный в систему компилятор Pascal. К сожалению, они обнаружили ошибку в генерации кода, но исправление для генератора кода вызвало ошибку в компиляторе, создавая плохой компилятор. Чтобы исправить это, потребовалось вручную исправить двоичные файлы из установленного компилятора, чтобы затем применить исправление к источнику, чтобы заменить себя.
personplinthschedule08.06.2010
comment
Я обнаружил, что этот вопрос задает вопрос, что именно можно делать в такой ситуации с ошибкой. Мне не приходило в голову исправление рук. Забавная история. ха-ха
- personGabrielF; 27.07.2017
Проблема только в самой первой версии. Как только у меня будет работать компилятор V1.0, я могу написать V2.0 на своем языке и использовать компилятор V1.0 для его компиляции. Затем я могу написать V3.0 и использовать V2.0 для его компиляции, использовать V3.0 для компиляции V4.0 и так далее.
personeemzschedule08.06.2010
comment
Вы имели ввиду V0.1? В первой версии не будет важных функций, и она не соответствует требованиям версии 1.0.
- persondarw; 18.10.2020
Первый проход компилятора обычно записывается на чем-то еще, пока язык не станет достаточно хорошо сформированным, чтобы можно было скомпилировать собственный компилятор, затем вы можете попасть в x, записанный в x.
В самом начале настоящий первый компилятор этого языка, конечно, был написан не на этом языке. На этом языке можно было бы написать самое второе. Более того, учитывая спецификацию языка, вы можете реализовать базовое ядро в компиляторе начальной загрузки, а затем написать полностью совместимый компилятор на этом языке, используя подмножество, понятное компилятору начальной загрузки. Компиляторы второго поколения тоже могут забыть о компиляторе начальной загрузки.
В какой-то момент вам понадобится компилятор (или интерпретатор), написанный на другом языке. Но это не обязательно должно быть эффективным и может быть выполнено на языке, который упрощает синтаксический анализ и создание прототипов (LISP популярен). После того, как вы использовали это для компиляции «самокомпилятора», вы можете отказаться от него и использовать результат.
personMichael Borgwardtschedule08.06.2010
comment
Не обязательно. Самым первым компилятором также может быть человек, и в этом случае вам не нужен компилятор начальной загрузки на другом языке вообще. Так были написаны первые компиляторы для большинства языков Никлауса Вирта: он в основном назначал их своим ученикам :-)
- personJörg W Mittag; 08.06.2010