2012-02-24 3 views
174

Это прослушивало меня некоторое время. Как скомпилировать gcc/g ++? Я предполагаю, что каждая ревизия компилируется с ранее построенной версией. Это правда? И если это так, значит ли это, что самые старые версии g ++/gcc были написаны на сборке?Как загружается gcc/g ++?

+13

Каждая ревизия, наконец, может быть скомпилирована сама по себе. :) –

+4

[This] (http://homepage.ntlworld.com/edmund.grimley-evans/bcompiler.html) интересно читать, если вы хотите увидеть, как появились первые компиляторы. – parkovski

+1

@parkovski Является ли ссылка мертвой? – Nubcake

ответ

167

Самая старая версия GCC была скомпилирована с использованием другого компилятора C, поскольку были другие, когда они были написаны. Самый первый C-компилятор (1973, IIRC) был реализован либо в сборке PDP-11, либо в предшествующем ему языке программирования B, но в любом случае компилятор B был записан в сборке. Аналогично, первый C++-компилятор (CPre/Cfront, 1979-1983), вероятно, впервые был реализован на C, а затем переписан на C++.

При компиляции GCC или любой другой самостоятельной хостинг компилятор, полный порядок здания:

  1. Построить новую версию GCC с существующим C компилятор
  2. заново строить новую версию GCC с тот, который вы только что создали
  3. (необязательно) повторите шаг 2 для целей проверки.

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

EDIT: Drew Dormann, в комментариях, указывает на счет Бьярна Страустрапа earliest implementation of C++. Он был реализован на C++, но переведен на то, что Stroustrup называет «препроцессором» от C++ до C; не полный компилятор по его определению, но все же C++ был загружен в C.

+1

Не повторяется ли шаг 2 несколько раз? Я считаю, что «clang» делает это. – bitmask

+0

Я не понимаю, почему, кроме тестирования. Предполагая, что исходный компилятор правильно реализует язык, он строит правильный, хотя возможно, субоптимальный компилятор, тогда как шаг 2 реализует все оптимизации, которые имеет новый компилятор. Окончательный двоичный файл не должен меняться после шага 2. –

+19

3-ступенчатая версия процесса сборки бутстрапа действительно для проверки: сам компилятор используется как собственный тестовый пример. GCC, скомпилированный с помощью [other], должен давать одинаковые результаты (идентичные двоичные файлы, дисконтирующие макросы, такие как '__DATE__' и' __TIME__', которые различаются даже между вызовами * такого же * компилятора), как GCC, скомпилированный с [GCC, скомпилированным с [другим]] - если нет, это ошибка, и 3-этапная сборка бутстрапов предназначена для того, чтобы поймать это. – pmdj

Смежные вопросы