Oltre a tutte le grandi risposte finora:
Hai un "pregiudizio dell'osservatore". Non osservi i bug e quindi presumi che non ce ne siano.
Pensavo come te. Poi ho iniziato a scrivere compilatori in modo professionale, e lascia che te lo dica, ci sono molti bug lì dentro!
Non vedi i bug perché scrivi codice che è proprio come il 99,999% di tutto il resto del codice che la gente scrive. Probabilmente scrivi un codice perfettamente normale, semplice e chiaramente corretto che chiama metodi ed esegue cicli e non fa nulla di strano o di strano, perché sei uno sviluppatore normale che risolve i normali problemi aziendali.
Non vedi alcun bug del compilatore perché i bug del compilatore non sono negli scenari di codice normale semplici da analizzare; i bug sono nell'analisi di codice strano che non si scrive.
Io d'altra parte ho il pregiudizio opposto dell'osservatore. Vedo codice pazzo tutto il giorno ogni giorno, e quindi per me i compilatori sembrano essere pieni di bug.
Se ti sei seduto con le specifiche del linguaggio di qualsiasi lingua e hai preso l'implementazione di un compilatore per quella lingua, e hai davvero cercato di determinare se il compilatore ha implementato esattamente la specifica o meno, concentrandoti su casi angolari oscuri, molto presto ti accorgeresti bug del compilatore abbastanza frequentemente. Lascia che ti faccia 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 fornisce tre errori.
- Un argomento ref o out deve essere una variabile assegnabile.
- La migliore corrispondenza per N (ref int x) ha argomenti non validi.
- "Ref" mancante sull'argomento 1.
Ovviamente il primo messaggio di errore è corretto e il terzo è un bug. L'algoritmo di generazione dell'errore sta cercando di capire perché il primo argomento non è valido, lo osserva, vede che è una costante e non torna al codice sorgente per verificare se è stato contrassegnato come "ref"; piuttosto, presume che nessuno sarebbe abbastanza sciocco da contrassegnare una costante come ref e decide che l'arbitro debba mancare.
Non è chiaro quale sia il terzo messaggio di errore corretto, ma non è così. In effetti, non è chiaro se il secondo messaggio di errore sia corretto. La risoluzione del sovraccarico dovrebbe fallire o "ref 123" dovrebbe essere trattato come un argomento ref del tipo corretto? Ora dovrò pensarci e parlarne con il team di triage in modo che possiamo determinare quale sia il comportamento corretto.
Non hai mai visto questo bug perché probabilmente non avresti mai fatto qualcosa di così sciocco da provare a passare 123 con ref. E se lo facessi, probabilmente non noteresti nemmeno che il terzo messaggio di errore è privo di senso, poiché il primo è corretto e sufficiente per diagnosticare il problema. Ma provo a fare cose del genere, perché sto cercando di interrompere il compilatore. Se ci provassi, vedresti anche i bug.