Oltre a tutte le grandi risposte finora:
Hai una "distorsione da osservatore". Non si osservano bug e quindi si presume che non ce ne siano.
Ero solito pensare come te. Poi ho iniziato a scrivere compilatori professionalmente, e lascia che te lo dica, ci sono molti bug lì dentro!
Non vedi i bug perché scrivi un codice che è pari al 99,999% di tutto il resto del codice scritto dalle persone. Probabilmente scrivi un codice perfettamente normale, diretto, chiaramente corretto che chiama i metodi ed esegue cicli e non fa niente di stravagante o strano, perché sei un normale sviluppatore che risolve i normali problemi di business.
Non vedi alcun bug del compilatore perché i bug del compilatore non si trovano in semplici scenari di codice normali facili da analizzare; i bug sono nell'analisi del codice strano che non scrivi.
D'altra parte ho il pregiudizio dell'osservatore opposto. Vedo codice pazzo tutto il giorno ogni giorno, quindi per me i compilatori sembrano pieni zeppi di bug.
Se ti siedi con le specifiche del linguaggio di qualsiasi lingua, e prendi qualsiasi implementazione del compilatore per quel linguaggio, e davvero provi a determinare se il compilatore ha implementato esattamente le specifiche o meno, concentrandoti su oscuri casi d'angolo, molto presto tu " d trovare bug del compilatore abbastanza frequentemente. Lasciatemi fare un esempio, ecco un bug del compilatore C # che ho trovato letteralmente cinque minuti fa.
static void N(ref int x){}
...
N(ref 123);
Il compilatore dà tre errori.
- Un argomento ref o out deve essere una variabile assegnabile.
- La migliore corrispondenza per N (ref int x) ha argomenti non validi.
- Manca "ref" sull'argomento 1.
Ovviamente il primo messaggio di errore è corretto e il terzo è un bug. L'algoritmo di generazione degli errori sta cercando di capire perché il primo argomento non è valido, lo guarda, vede che è una costante e non torna al codice sorgente per verificare se è stato contrassegnato come "ref"; piuttosto, presuppone che nessuno sarebbe abbastanza sciocco da segnare una costante come ref e decide che l'arbitro deve essere mancante.
Non è chiaro quale sia il terzo messaggio di errore corretto, ma non è così. In realtà, non è chiaro se il messaggio di errore secondo sia corretto. La risoluzione del sovraccarico dovrebbe fallire, o il "ref 123" dovrebbe essere trattato come un argomento ref di tipo corretto? Ora dovrò pensarci e discuterne con il team di triage in modo da poter determinare quale sia il comportamento corretto.
Non hai mai visto questo bug perché probabilmente non avresti mai fatto qualcosa di così stupido da provare a passare 123 per ref. E se lo facessi, probabilmente non ti accorgerai nemmeno che il terzo messaggio di errore è privo di senso, poiché il primo è corretto e sufficiente per diagnosticare il problema. Ma cerco di fare cose del genere, perché sto cercando di rompere il compilatore. Se ci hai provato, vedresti anche gli errori.