Los compiladores son programas de utilidad: convierten el texto del lenguaje de programación en código de máquina. Si el lenguaje de programación describe software que resulta ser un compilador .....
Los compiladores también pueden producir código de máquina para otras arquitecturas. Por ejemplo, Apple compila iOS usando bastidores de servidores basados en Intel. El compilador no tiene que ejecutar el código ARM que genera, solo escríbalo en el disco.
El compilador 2.0 debe estar escrito en un lenguaje que el compilador 1.0 pueda procesar, pero ciertamente puede crear el compilador 2.0 con nuevas características como la optimización. Luego puede volver a compilar el código fuente usando el compilador 2.0 y hacer una mejor versión de sí mismo. Nuevamente, el compilador no sabe que está haciendo otra versión de sí mismo.
Si retrocedemos lo suficiente en las brumas del tiempo, llegamos a un punto en el que no tenemos compilador: la primera iteración de un lenguaje de alto nivel. Luego tenemos que sacar los lápices y los libros de códigos de operación y escribir el primero en conjunto. ¿Cómo escribimos el primer ensamblador? Entrada directa de código de máquina, probablemente en cinta de papel perforada, o interruptores en el panel frontal.