Как можно написать компилятор языка на этом языке?

Возможные дубликаты:
реализация компилятора в себе
Загрузка языка

Как вы можете написать компилятор на том же языке, что и язык, для которого вы пишете этот компилятор? Разве это не рекурсивно?

Изменить: это можно удалить, но в противном случае ...:

Как выполнить загрузку:

Почему для начальной загрузки:


person froadie    schedule 08.06.2010    source источник
comment
Различные более ранние версии и связанные ссылки: stackoverflow.com/questions/13537/bootstrapping-a- язык stackoverflow.com/questions/1493747/ stackoverflow.com/questions/193560/ stackoverflow.com/questions/1173780/ stackoverflow.com/questions/2035838/ stackoverflow.com/questions/2740994/ Вы хотели сказать, что это начальная загрузка.   -  person dmckee --- ex-moderator kitten    schedule 08.06.2010
comment
Интересно, как часто люди реализуют компиляторы для основных языков, используя эзотерические.   -  person JAB    schedule 08.06.2010
comment
@ Фил Росс - вау, спасибо, как ты это нашел? не знал, как искать :)   -  person froadie    schedule 08.06.2010
comment
Я искал загрузку компилятора, используя поле поиска в правом верхнем углу.   -  person Phil Ross    schedule 09.06.2010


Ответы (6)


Обычно первая версия компилятора написана на другом языке, а затем каждая последующая версия написана на этом языке и скомпилирована с более старой версией. После того, как вы скомпилировали версию x с версией x-1, вы можете использовать недавно созданную версию x для перекомпиляции, используя преимущества любых новых оптимизаций, представленных в этой версии; GCC делает свои релизы таким образом

person Michael Mrozek    schedule 08.06.2010
comment
+1 Я построил простой интерпретатор Лиспа на JAVA. - person Achilles; 08.06.2010
comment
так ... почему нельзя просто использовать первую версию компилятора? Зачем вам двухуровневый компилятор? - person froadie; 08.06.2010
comment
@froadie Вы имеете в виду, почему бы не скомпилировать каждую версию с версией 1? Обычно новые версии компилятора генерируют лучший машинный код, чем предыдущие версии, поэтому сборка с использованием новейшей версии сделает сам компилятор максимально быстрым и эффективным. Кроме того, если сам язык меняется, и вы хотите использовать эти новые функции в исходном коде компилятора, вам нужно будет выполнить сборку с более новой версией. - person Michael Mrozek; 09.06.2010
comment
@MichaelMrozek, это круто, ты хочешь сказать, что все языки происходят от ассемблера? - person CMCDragonkai; 28.05.2014
comment
@froadie см. q bootstrapping-a-compiler-why? - person nawfal; 23.07.2014
comment
@nawfal - я добавил ссылку на этот вопрос в свой вопрос вскоре после того, как задал вопрос несколько лет назад. - person froadie; 23.07.2014
comment
@froadie о да, я это пропустила ... - person nawfal; 23.07.2014

Это. Обычно вам нужна начальная версия языка, скомпилированная или интерпретированная с другого языка.

И чтобы немного поразить ваш разум, много лет назад я прочитал историю компилятора Паскаля, написанного в качестве проекта для аспирантов. Он написан на Паскале и скомпилирован с помощью встроенного в систему компилятора Паскаля. В конце концов, этого было достаточно, чтобы заменить встроенный в систему компилятор Pascal. К сожалению, они обнаружили ошибку в генерации кода, но исправление для генератора кода вызвало ошибку в компиляторе, создавая плохой компилятор. Чтобы исправить это, потребовалось вручную исправить двоичные файлы из установленного компилятора, чтобы затем применить исправление к источнику, чтобы заменить себя.

person plinth    schedule 08.06.2010
comment
Я обнаружил, что этот вопрос задает вопрос, что именно можно делать в такой ситуации с ошибкой. Мне не приходило в голову исправление рук. Забавная история. ха-ха - person GabrielF; 27.07.2017

Проблема только в самой первой версии. Как только у меня будет работать компилятор V1.0, я могу написать V2.0 на своем языке и использовать компилятор V1.0 для его компиляции. Затем я могу написать V3.0 и использовать V2.0 для его компиляции, использовать V3.0 для компиляции V4.0 и так далее.

person eemz    schedule 08.06.2010
comment
Вы имели ввиду V0.1? В первой версии не будет важных функций, и она не соответствует требованиям версии 1.0. - person darw; 18.10.2020

Первый проход компилятора обычно записывается на чем-то еще, пока язык не станет достаточно хорошо сформированным, чтобы можно было скомпилировать собственный компилятор, затем вы можете попасть в x, записанный в x.

person Lazarus    schedule 08.06.2010

В самом начале настоящий первый компилятор этого языка, конечно, был написан не на этом языке. На этом языке можно было бы написать самое второе. Более того, учитывая спецификацию языка, вы можете реализовать базовое ядро ​​в компиляторе начальной загрузки, а затем написать полностью совместимый компилятор на этом языке, используя подмножество, понятное компилятору начальной загрузки. Компиляторы второго поколения тоже могут забыть о компиляторе начальной загрузки.

person ShinTakezou    schedule 08.06.2010

В какой-то момент вам понадобится компилятор (или интерпретатор), написанный на другом языке. Но это не обязательно должно быть эффективным и может быть выполнено на языке, который упрощает синтаксический анализ и создание прототипов (LISP популярен). После того, как вы использовали это для компиляции «самокомпилятора», вы можете отказаться от него и использовать результат.

person Michael Borgwardt    schedule 08.06.2010
comment
Не обязательно. Самым первым компилятором также может быть человек, и в этом случае вам не нужен компилятор начальной загрузки на другом языке вообще. Так были написаны первые компиляторы для большинства языков Никлауса Вирта: он в основном назначал их своим ученикам :-) - person Jörg W Mittag; 08.06.2010