Ответ 1
Конкретная история для gcc приведена в GCC Wiki. Более общий момент состоит в том, что компиляторы обычно изначально компилируются с каким-то другим компилятором, пока они не станут достаточно мощными для компиляции. В качестве альтернативы можно написать базовый компилятор, который может обрабатывать подмножество ваших функций на ассемблере и создавать оттуда. Но опять же это почти никогда не нужно. На разных языках доступно множество компиляторов. Даже когда Стивен Джонсон писал pcc (один из первых компиляторов C), были доступны компиляторы для B, а также многие другие языки. У gcc было несколько компиляторов, чтобы выбрать изначально, и RMS говорит, что он использовал компилятор Pastel, по крайней мере, во время его первоначальной разработки.
Помните, что нет требования о том, чтобы компилятор C был написан на C. Вы могли бы написать его в Perl, если хотите. Нет требования, чтобы компилятор для данной платформы был первоначально написан на этой платформе (встроенные системы почти всегда компилируются в какой-либо другой системе). Таким образом, есть много способов, чтобы загрузиться самостоятельно.
В этом вопросе есть несколько интересных тонкостей, связанных с первым экземпляром начальной загрузки компилятора. Если бы вы были очень умны, вы могли бы использовать этот бутстрап, чтобы сделать нечто невероятное, блестящее и страшное.