Compiladores são programas utilitários - eles transformam o texto da linguagem de programação em código de máquina. Se a linguagem de programação descreve um software que por acaso é um compilador ...
Os compiladores também podem produzir código de máquina para outras arquiteturas. Por exemplo, a Apple compila o iOS usando racks de servidores baseados em Intel. O compilador não precisa executar o código ARM gerado, basta gravá-lo no disco.
O compilador 2.0 deve ser escrito em um idioma que o compilador 1.0 possa processar, mas certamente pode criar o compilador 2.0 com recursos mais recentes, como otimização. Você pode recompilar o código-fonte usando o compilador 2.0 e criar uma versão melhor de si mesmo. Novamente, o compilador não sabe que está fazendo outra versão de si mesmo.
Se voltarmos o suficiente para as brumas do tempo, chegamos a um ponto em que não temos compilador - a primeira iteração de uma linguagem de alto nível. Então temos que pegar os lápis e opcode livros e escrever o primeiro na montagem. Como escrevemos o primeiro montador? Entrada direta do código da máquina, provavelmente em fita de papel perfurada ou interruptores no painel frontal.