Existem três linguagens envolvidas em um compilador: a linguagem que está sendo compilada (linguagem de origem), a linguagem que está sendo compilada (linguagem de destino) e a linguagem na qual o compilador é escrito (linguagem de implementação). Em geral, a linguagem de implementação é uma linguagem de propósito geral, como C ou C ++, ou o idioma de origem . O idioma de destino pode ser algum idioma adequado próximo ao idioma de origem que já existe ou assembly. Às vezes, há um idioma intermediário personalizado, para que possa haver um back-end comum para vários idiomas. É assim que o gcc funciona. Existe um front-end para C, C ++, Fortran, Ada e provavelmente outros. Cada um é compilado na mesma linguagem intermediária, que é então compilada na linguagem de montagem específica da arquitetura.
Se o compilador é escrito na mesma linguagem que está compilando, o compilador é chamado de auto-hospedagem . Se uma linguagem é nova, então nenhum compilador já existe, o que significa que seu primeiro compilador não pode ser auto-hospedável (caso contrário, como esse primeiro compilador seria compilado?). Como resultado, a primeira iteração de qualquer compilador para um novo idioma é sempre escrita em um idioma diferente. Dito isto, uma auto-hospedagem é mais conveniente; o (s) autor (es) só precisa ser proficiente em um idioma.