Steve Yegge ha scritto un ottimo post sul blog che, indirettamente, indirizza gli indirizzi questo.
I
Big point n. 1: comprendono praticamente tutti gli aspetti dell'informatica. Sono un corso di livello superiore perché è necessario conoscere tutte le altre cose che si apprendono nel curriculum di informatica per iniziare. Strutture dati, ricerca e ordinamento, prestazioni asintotiche, colorazione grafica? È tutto lì dentro.
C'è una ragione per cui Knuth ha lavorato alla sua monumentale (e inarrestabile) "Art of Computer Programming" per diversi decenni, anche se è iniziato come (solo) un libro di testo per il compilatore. Allo stesso modo in cui Carl Sagan ha dichiarato: "Se desideri creare 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, qualunque cosa stia facendo. Al contrario, se non scrivi un compilatore nella tua lingua, c'è una buona probabilità che manchi qualcosa che è veramente importante per qualcuno, perché gli implementatori linguistici non hanno mai dovuto scrivere un programma che avrebbe richiesto loro di pensare su tutti questi problemi.
Punto grosso n. 2: da 30.000 piedi, un numero sorprendente di problemi assomigliano proprio ai compilatori.
Compilers take a stream of symbols, figure out their structure according to some domain-specific predefined rules, and transform them into another symbol stream. Sounds pretty general, doesn't it? Well, yeah.
Che tu sia nel team di Visual C ++ o meno, molto spesso ti troverai a dover fare qualcosa che assomigli a una parte di un compilatore. Lo faccio letteralmente ogni giorno.
A differenza della maggior parte delle altre professioni, i programmatori non usano solo strumenti, ma costruiscono i propri strumenti. Un programmatore che non può (per mancanza di competenze, o la mancanza di strumenti utilizzabili con cui costruire altri strumenti) scrivere strumenti sarà per sempre handicappato, limitato agli strumenti che qualcun altro fornisce.
Se un linguaggio non è "adatto alla creazione di" programmi che possono prendere un flusso di simboli, applicare loro delle regole e trasformarlo in un altro flusso di simboli, che suona come un linguaggio piuttosto limitato, e non uno che sarebbe utile per me.
(Fortunatamente, non penso che ci siano molti linguaggi di programmazione che non sono adatti alla trasformazione dei simboli. C è probabilmente tra i peggiori linguaggi utilizzati al giorno d'oggi, tuttavia i compilatori C di solito sono auto-ospitati, quindi non si fermano mai chiunque.)
Una terza ragione finirò con, per esperienza personale, non menzionata da Yegge (perché non stava scrivendo su "why self-host"): scuote i bug. Quando scrivi un compilatore, significa che ogni volta che lo lo compila (non solo ogni volta che esegui ), ne fai affidamento perché funzioni e funzioni correttamente contro un codebase di dimensioni decenti (lo stesso compilatore).
Questo mese ho usato un compilatore non-self-host relativamente nuovo e famoso (probabilmente puoi indovinare quale), e non posso andare 2 giorni senza segmentare la cosa. Mi chiedo quanto i designer abbiano effettivamente dovuto usarlo.