Non ho intenzione di scrivere un compilatore nel prossimo futuro; tuttavia, sono abbastanza interessato alle tecnologie del compilatore e a come queste cose potrebbero essere migliorate.
A partire dai linguaggi compilati, la maggior parte dei compilatori ha due livelli di errore: avvertenze ed errori, il primo è il più delle volte non fatali da correggere e errori che indicano la maggior parte delle volte che è impossibile produrre macchine (o byte-) codice dall'input.
Tuttavia, questa è una definizione piuttosto debole. In alcuni linguaggi come Java, alcuni avvisi sono semplicemente impossibili da eliminare senza utilizzare la direttiva @SuppressWarning
. Inoltre, Java considera alcuni errori non fatali come errori (ad esempio, il codice non raggiungibile in Java genera un errore per una ragione che mi piacerebbe conoscere).
C # non ha gli stessi problemi, ma ne ha alcuni. Sembra che la compilazione avvenga in più passaggi e un errore di mancata gestione impedirà l'esecuzione degli ulteriori passaggi. Per questo motivo, il conteggio degli errori che si ottiene quando la build fallisce è spesso grossolanamente sottostimato. In una corsa potresti dire che hai due errori, ma una volta risolti, ne riceverai 26 nuovi.
Il passaggio a C e C ++ mostra semplicemente una cattiva combinazione sulle debolezze diagnostiche della compilazione di Java e C # (anche se potrebbe essere più accurato dire che Java e C # andavano a testa a mano con metà dei problemi ciascuno). Alcuni avvertimenti dovrebbero essere veramente errori (ad esempio quando non tutti i percorsi di codice restituiscono un valore) e tuttavia sono avvertimenti perché, suppongo, nel momento in cui hanno scritto lo standard, la tecnologia del compilatore non era abbastanza buona da rendere questo tipo di controlli obbligatori Allo stesso modo, i compilatori spesso controllano più di quanto dice lo standard, ma usano ancora il livello di errore di avviso "standard" per i risultati aggiuntivi. E spesso, i compilatori non segnaleranno tutti gli errori che potrebbero trovare subito; potrebbe richiedere un paio di compilazioni per sbarazzarsi di tutti loro. Per non parlare degli errori criptici che i compilatori C ++ amano sputare, in cui un singolo errore può causare decine di messaggi di errore.
Ora aggiungendo che molti sistemi di compilazione sono configurabili per segnalare errori quando i compilatori emettono avvisi, otteniamo solo uno strano mix: non tutti gli errori sono fatali, ma alcuni avvertimenti dovrebbero; non tutti gli avvertimenti sono meritati, ma alcuni sono esplicitamente soppressi senza ulteriore menzione della loro esistenza; e a volte tutti gli avvisi diventano errori.
Le lingue non compilate hanno ancora la loro parte di segnalazione di errori di merda. I tentativi di digitazione in Python non verranno segnalati fino a quando il codice non verrà effettivamente eseguito e non potrai mai kickare più di un errore alla volta perché lo script smetterà di essere eseguito dopo che ne ha incontrato uno.
PHP, da parte sua, ha un sacco di livelli di errore più o meno significativi, eccezioni e . Gli errori di Parse sono segnalati uno alla volta, gli avvertimenti sono spesso così brutti che dovrebbero abortire il tuo script (ma non di default), le avvertenze mostrano spesso gravi problemi logici, alcuni errori non sono abbastanza cattivi per fermare il tuo script ma comunque e, come al solito con PHP, ci sono alcune cose davvero strane laggiù (perché diavolo abbiamo bisogno di un livello di errore per errori fatali che non sono davvero fatali? E_RECOVERABLE_E_ERROR
, sto parlando con te).
Mi sembra che ogni singola implementazione del report di errore del compilatore a cui riesco a pensare sia interrotta. Il che è un vero peccato, dal momento che tutti i bravi programmatori insistono sull'importanza di trattare correttamente gli errori e tuttavia non possono ottenere i propri strumenti per farlo.
Quale pensi che dovrebbe essere il modo giusto per segnalare gli errori del compilatore?