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

17
  

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

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

Edit : Это может быть удалено, но в противном случае ...:

Как загрузиться:

Почему загрузочный файл:

задан froadie 08.06.2010 в 17:27
источник
  • Различные более ранние версии и связанные ссылки: stackoverflow.com/questions/13537/bootstrapping-a-language stackoverflow.com/questions/1493747/... stackoverflow.com/questions/193560/... stackoverflow.com/questions/1173780/... stackoverflow.com/questions/2035838/... stackoverflow.com/questions/2740994/... Слово, которое вы хотели, было «bootstrapping». –  dmckee 08.06.2010 в 17:29
  • Интересно, как часто люди внедряют компиляторы для основных языков, используя эзотерические. –  JAB 08.06.2010 в 17:33
  • @Phil Ross - вау, спасибо, как вы это нашли? не был уверен, как искать :) –  froadie 08.06.2010 в 17:36
  • Я искал загрузку компилятора, используя окно поиска в правом верхнем углу. –  Phil Ross 08.06.2010 в 22:59

6 ответов

25

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

    
ответ дан Michael Mrozek 08.06.2010 в 17:28
источник
  • +1 Я построил простой интерпретатор Lisp в JAVA. –  Achilles 08.06.2010 в 17:30
  • так ... почему вы не можете просто использовать первую версию компилятора? Зачем вам нужен двухуровневый компилятор? –  froadie 08.06.2010 в 18:08
  • @froadie Вы имеете в виду, почему бы не скомпилировать каждую версию с версией 1? Обычно новые версии компилятора генерируют более эффективный машинный код, чем предыдущие, поэтому создание с использованием новейшей версии сделает сам компилятор максимально быстрым и эффективным. Кроме того, если сам язык изменяется и вы хотите использовать эти новые функции в исходном коде компилятора, вам нужно будет создать более новую версию –  Michael Mrozek 08.06.2010 в 22:36
  • @MichaelMrozek, это довольно круто, вы говорите, что все языки происходят из собрания? –  CMCDragonkai 28.05.2014 в 16:21
  • @froadie см. этот q bootstrapping-a-compiler-why? –  nawfal 23.07.2014 в 09:50
Показать остальные комментарии
11

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

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

    
ответ дан plinth 08.06.2010 в 17:29
источник
  • Я нашел этот вопрос, задаваясь вопросом, что именно можно было бы сделать в подобной ситуации с ошибкой. Ручной патч не приходил мне в голову. Забавная история. ха-ха –  GabrielF 27.07.2017 в 21:40
4
all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all all Как только у меня есть V1.0 работающего компилятора, я могу написать V2.0 на своем языке и использовать компилятор V1.0 для его компиляции. Затем я могу написать V3.0 и использовать V2.0 для компиляции, используя V3.0 для компиляции V4.0 и т. Д.

    
ответ дан eemz 08.06.2010 в 17:29
источник
1

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

    
ответ дан Lazarus 08.06.2010 в 17:29
источник
1

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

    
ответ дан ShinTakezou 08.06.2010 в 17:31
источник
1

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

    
ответ дан Michael Borgwardt 08.06.2010 в 17:31
источник
  • Не обязательно. Самый первый «компилятор» также может быть человеком, и в этом случае вам не нужен компилятор начальной загрузки на другом языке. Вот так написаны первые компиляторы для большинства языков Никлауса Вирта: он в основном назначил их своим ученикам :-) –  Jörg W Mittag 08.06.2010 в 19:51