1. сборка нового gcc старым (с оптимизацией или нет - я не помню)
2. сборка новым нового без оптимизаций
3. сборка нового с оптимизациями новым без оптимизаций.
что-то вроде такого, хотя могу ошибаться - бутсрапил гцц очень давно.
Сначала собирается старым компилятором (первая стадия), потом новым компилятором без оптимизаций (бинарника самого компилятора) собирается версия с оптимизациями (вторая стадия), а потом версией с оптимизациями собирается финальная версия, дабы убедиться в их бинарной идентичности.
>1. сборка нового gcc старым (с оптимизацией или нет - я не помню)
2. сборка новым нового без оптимизаций
3. сборка нового с оптимизациями новым без оптимизаций.
1. Сборка нового старым
2. Сборка нового результатом шага 1
3. Сборка нового результатом шага 2
3a. Сравнение объектных файлов от шагов 2 и 3. Если хотя бы один файл различается, сборка считается неудачной.
Этого я ни разу не видел. Цель проверки - убедиться, что gcc собирает себя правильно.
Результат первой стадии представляет собой двоичный код, который делает в точности то, что написано в исходниках gcc (возможно, медленно, если старый компилятор не умеет оптимизировать как следует). Результат второй стадии делает то же самое, и, кроме того, сам собран по правилам, написанным в исходниках gcc (т.е. сам компилятор как двоичный файл может отличаться от первой стадии, но обязан давать то же самое в выходных файлах). Результат третьей стадии получается из тех же исходников по тому же алгоритму преобразования в машинный код. При обнаружении отличия от второй стадии следует немедленно сообщить об ошибке в gcc или о серьезно поломанном первоначальном компиляторе.
Ага, а ассемблер святым духом вводился? :) В начале было программирование перемычками и переключателями. Потом - ввод двоичных данных через "монитор" (BIOS + микроОС в ПЗУ). Потом уже - рост сложности ассемблеров :)
...
Мой путь в компы начался с ручного ввода машкодов через монитор "РК-86" :)