Как компилятор языка может быть написан на этом языке? [дубликат]
Возможные Дубликаты:
реализация компилятора в "себя"
загрузка языка
Как вы можете написать компилятор на том же языке, на котором вы пишете этот компилятор? Разве это не рекурсивно?
редактировать: Это может быть удалено, но в противном случае... :
Как в бутстрэп:
почему на ушко:
6 ответов
обычно первая версия компилятора написана на другом языке, а затем каждая последующая версия написана на этом языке и скомпилирована с более старой версией. После того, как вы скомпилировали версию x
с версии x-1
, вы можете использовать недавно построенный версии x
перекомпилировать себя, используя любые новые оптимизации, которые вводит версия; GCC делает свои релизы таким образом
Это. Обычно требуется загрузочная версия языка, скомпилированная или интерпретированная с другого языка.
и чтобы еще немного согнуть ваш ум, несколько лет назад я прочитал историю компилятора Pascal, написанную как проект аспиранта. Он написан на Паскале и скомпилирован со встроенным компилятором системы Pascal. В конце концов, это было достаточно хорошо, чтобы заменить встроенный компилятор Pascal системы. К сожалению, они нашли ошибку в генерации кода, но исправление для генератор кода вызвал ошибку в компиляторе, создав плохой компилятор. Чтобы исправить это, необходимо вручную латать двоичные файлы из установленного компилятора, чтобы затем применить патч к источнику для замены.
Это только проблема для самой первой версии, когда-либо. Как только у меня будет V1.0 из работающего компилятора я могу написать V2.0 на моем языке и используйте V1.0 компилятор для его компиляции. Тогда я могу написать V3.0 и использовать V2.0 чтобы скомпилировать это, используйте V3.0 для компиляции V4.0 и так далее.
первый проход компилятора обычно пишется в чем-то другом, пока язык не будет достаточно хорошо сформирован, чтобы иметь возможность компилировать собственный компилятор, тогда вы можете попасть в x, написанный в x.
в самом начале настоящий первый компилятор этого языка был написан не на этом языке, конечно. На этом языке можно было бы написать и второе. Кроме того, учитывая спецификацию языка, вы можете реализовать базовое ядро в компиляторе начальной загрузки, а затем написать полный совместимый компилятор на этом языке, используя подмножество, понятное компилятору "начальной загрузки". Компиляторы второго поколения также могут забыть компилятор "bootstrap".
в какой-то момент, вам нужен компилятор (или интерпретатор), написанного на другом языке. Но это не должно быть эффективным и может быть сделано на языке, который упрощает синтаксический анализ и прототипирование (LISP популярен). После того, как вы использовали это для компиляции "self-compiler", вы можете отказаться от него и использовать результат.