Как компилятор C может быть написан на C? [дубликат]
этот вопрос уже есть ответ здесь:
- написание компилятора на своем языке 12 ответов
этот вопрос может возникнуть из-за непонимания компиляторов с моей стороны, но здесь идет...
в предисловии к первому изданию K&R (страница xi):
операционные системы компилятор C, и по существу все прикладные программы UNIX (включая все программное обеспечение, используемое для подготовки этой книги) написаны на C.
(Курсив мой)
вот что я не понимаю: разве этот компилятор C не должен быть скомпилирован сам, прежде чем он сможет скомпилировать любой код C? И если этот компилятор C написан на C, его компиляция не потребует уже существующего C компилятор?!
единственный выход из этой головоломки бесконечной регрессии (или проблемы курицы и яйца) заключается в том, что компилятор C, написанный на C, на который ссылается K&R, был фактически скомпилирован с уже существующим компилятором C, который был написан на языке, отличном от C. компилятор C, написанный на C, затем заменил последний.
или я полностью покинуть?
4 ответов
Это называется загрузки, цитата из Википедии:
Если нужен компилятор для языка X, чтобы получить компилятор для языка X (который написан на языке X), как был написан первый компилятор? Возможные методы решения этой проблемы курицы или яйца включают в себя:
- реализация интерпретатора или компилятора для языка X на языке Y. Niklaus Wirth сообщил, что написал первый компилятор Pascal в Фортран.
- другой интерпретатор или компилятор для X уже написан в другой язык Y; вот как схема часто загружается.
- более ранние версии компилятора были написаны в подмножестве X для который существовал какой-то другой компилятор; вот как некоторые суперсеты Java, Haskell и исходный бесплатный компилятор Pascal загрузившей.
- компилятор для X скомпилирован из другой архитектуры, где существует компилятор для X; вот как компиляторы для C обычно портируется на другие платформы. Также это метод, используемый для Бесплатный Pascal после начальной загрузки.
- запись компилятора в X; затем ручная компиляция его из источника (большинство вероятно, не оптимизированным способом) и запуск этого кода, чтобы получить оптимизирующий компилятор. Дональд Кнут использовал это для своего веб-грамотного система программирования.
и если вам интересно,здесь является первым компилятором C Денниса Ричи источник.
см. раздел курица и яйцо Википедия страницы:
Если нужен компилятор для языка X, чтобы получить компилятор для языка X (который написан на языке X), как был написан первый компилятор? Возможные методы решения этой проблемы курицы или яйца включают в себя:
- реализация интерпретатора или компилятора для языка X на языке Y. Niklaus Wirth сообщил, что он написал первый компилятор Pascal в Фортран.
- другой интерпретатор или компилятор для X уже написан на другом языке Y; именно так схема часто загружается.
- более ранние версии компилятора были написаны в подмножестве X, для которого существовал какой-то другой компилятор; так загружаются некоторые суперсеты Java, Haskell и исходный компилятор Free Pascal.
- компилятор для X скомпилирован из другой архитектуры, где существует компилятор для X; это как компиляторы для C обычно портируются на другие платформы. Также это метод, используемый для бесплатного Pascal после начальной загрузки.
- запись компилятора в X; затем ручная компиляция его из источника (скорее всего, не оптимизированным способом) и запуск этого в коде, чтобы получить оптимизированный компилятор. Дональд Кнут использовал это для своей веб-грамотной системы программирования.
обычно первый компилятор пишется на другом языке (непосредственно в ассемблере PDP11 в этом случае или на C для большинства "современных" языков). Затем этот первый компилятор используется для программирования компилятор, написанный на самом языке.
вы можете ознакомиться страница об истории языка Си. Вы увидите, что он также сильно связан с системой UNIX.
Это совершенно нормально для компилятора, чтобы быть написанным на языке, который он компилирует. Один из способов добиться этого было бы написать полный компилятор для языка L в какой-то другой язык, а затем написать новый компилятор для Л л. более интересным подходом было бы написать минимальный компилятор для подмножества L в какой-то другой язык, а затем с помощью этого минимального набора для улучшения компилятора, что делает его менее минимального увеличения доступного подмножества л. Таким образом, полноценный компилятор можно построить.