Steve Yegge escreveu um ótimo post que, de maneira indireta, trata disso.
Grande ponto # 1: os compiladores abrangem praticamente todos os aspectos da ciência da computação. Eles são um curso de nível superior, porque você precisa saber todas as outras coisas que aprender no currículo de ciências da computação apenas para começar. Estruturas de dados, pesquisa e classificação, desempenho assintótico, coloração de gráficos? Está tudo lá.
Há uma razão pela qual Knuth trabalha em sua monumental (e interminável) "Art of Computer Programming" há várias décadas, mesmo que tenha começado como (apenas) um livro de compilador. Da mesma forma que Carl Sagan disse: "Se você deseja fazer uma torta de maçã a partir do zero, você deve primeiro inventar o universo"; se você deseja escrever um compilador, deve primeiro lidar com quase todos os aspectos da ciência da computação.
Isso significa que, se o compilador for auto-hospedado, certamente será capaz de fazer o que eu preciso, não importa o que eu esteja fazendo. Por outro lado, se você não escreveu um compilador em seu idioma, há uma boa chance de ele perder algo realmente importante para alguém, porque os implementadores de idiomas nunca precisaram escrever um programa que exigisse que pensassem em todos esses problemas.
Grande ponto # 2: de 30.000 pés, um número surpreendente de problemas se parece com compiladores.
Os compiladores pegam um fluxo de símbolos, descobrem sua estrutura de acordo com algumas regras predefinidas específicas do domínio e os transformam em outro fluxo de símbolos. Parece bastante geral, não é? Bem, sim.
Quer você esteja na equipe do Visual C ++ ou não, muitas vezes você precisará fazer algo que pareça parte de um compilador. Eu faço isso literalmente todos os dias.
Ao contrário da maioria das outras profissões, os programadores não usam apenas ferramentas, mas constroem suas próprias ferramentas. Um programador que não puder (devido à falta de habilidade ou falta de ferramentas utilizáveis com as quais construir outras ferramentas) escreverá ferramentas para sempre será prejudicado, limitado às ferramentas fornecidas por outra pessoa.
Se um idioma "não é adequado para criar" programas que podem receber um fluxo de símbolos, aplicando regras a eles e transformá-lo em outro fluxo de símbolos, isso soa como um idioma bastante limitado e não seria útil para mim.
(Felizmente, acho que não existem muitas linguagens de programação inadequadas para transformar símbolos. C é provavelmente uma das piores linguagens usadas atualmente, mas os compiladores C geralmente são auto-hospedados, de modo que nunca impediram ninguém.)
Uma terceira razão pela qual terminarei, por experiência pessoal, não mencionada por Yegge (porque ele não estava escrevendo sobre "por que se auto-hospedar"): elimina erros. Quando você está escrevendo um compilador, isso significa que toda vez que você o compila (não apenas toda vez que o executa ), depende dele para funcionar e funcionar corretamente em uma base de código de tamanho decente (o próprio compilador).
Este mês, estou usando um compilador não hospedado relativamente novo e famoso (você provavelmente pode adivinhar qual) e não posso passar dois dias sem segfaulting a coisa. Eu me pergunto o quanto os designers realmente tiveram que usá-lo.