Steve Yegge ha scritto un ottimo post sul blog che, indirettamente, affronta questo problema.
Punto 1 n. 1: i compilatori comprendono praticamente ogni aspetto dell'informatica. Sono un corso di livello superiore perché per iniziare devi conoscere tutte le altre cose che impari nel curriculum di informatica. Strutture dati, ricerca e ordinamento, prestazioni asintotiche, colorazione grafica? È tutto lì dentro.
C'è una ragione per cui Knuth ha lavorato sul suo monumentale (e senza fine) "Art of Computer Programming" per diversi decenni, anche se è iniziato come (solo) un libro di testo per compilatori. Allo stesso modo in cui Carl Sagan disse "Se vuoi fare una torta di mele da zero, devi prima inventare l'universo", se vuoi scrivere un compilatore, devi prima occuparti di quasi ogni aspetto dell'informatica.
Ciò significa che se il compilatore è auto-ospitato, allora è abbastanza sicuro di essere in grado di fare ciò di cui ho bisogno, indipendentemente da ciò che sto facendo. Al contrario, se non hai scritto un compilatore nella tua lingua, c'è una buona probabilità che manchi qualcosa di veramente importante per qualcuno, perché gli implementatori del linguaggio non hanno mai dovuto scrivere un programma che richiedesse loro di pensare a tutti quei problemi.
Grande punto n. 2: da 30.000 piedi, un numero sorprendente di problemi sembra proprio un compilatore.
I compilatori prendono un flusso di simboli, determinano la loro struttura secondo alcune regole predefinite specifiche del dominio e li trasformano in un altro flusso di simboli. Sembra abbastanza generale, vero? Bene sì.
Che tu faccia parte o meno del team di Visual C ++, molto spesso ti ritroverai a dover fare qualcosa che assomiglia a un compilatore. Lo faccio letteralmente ogni giorno.
A differenza della maggior parte delle altre professioni, i programmatori non solo usano strumenti, ma costruiscono i propri strumenti. Un programmatore che non è in grado (a causa della mancanza di abilità o della mancanza di strumenti utilizzabili con cui costruire altri strumenti) di scrivere per sempre sarà handicappato, limitato agli strumenti forniti da qualcun altro.
Se una lingua "non è adatta alla creazione" di programmi che possono prendere un flusso di simboli, applicarli a regole e trasformarlo in un altro flusso di simboli, sembra un linguaggio piuttosto limitato e non uno che sarebbe utile per me.
(Fortunatamente, non penso che ci siano molti linguaggi di programmazione inadatti alla trasformazione dei simboli. C è probabilmente tra i peggiori linguaggi in uso oggi, ma i compilatori C sono di solito auto-ospitati, quindi non hanno mai fermato nessuno.)
Un terzo motivo con cui finirò, per esperienza personale, non menzionato da Yegge (perché non stava scrivendo del "perché auto-host"): scuote i bug. Quando si scrive un compilatore, ciò significa ogni volta che lo si crea (non solo ogni volta che lo si esegue ), si dipende da esso per funzionare e funzionare correttamente su una base di codice di dimensioni decenti (il compilatore stesso).
Questo mese ho usato un compilatore non self-hosted relativamente nuovo e famoso (probabilmente puoi indovinare quale), e non posso andare 2 giorni senza segfaultare la cosa. Mi chiedo quanto i designer dovevano effettivamente usarlo.