Non ho intenzione di scrivere un compilatore nel prossimo futuro; tuttavia, sono abbastanza interessato alle tecnologie di compilazione e al modo in cui queste cose potrebbero essere migliorate.
A partire dai linguaggi compilati, la maggior parte dei compilatori ha due livelli di errore: avvisi ed errori, il primo è il più delle volte cose non fatali che dovresti correggere e errori che indicano la maggior parte delle volte che è impossibile produrre machine- (o byte-) codice dall'input.
Tuttavia, questa è una definizione piuttosto debole. In alcune lingue come Java, alcuni avvisi sono semplicemente impossibili da eliminare senza usare la @SuppressWarning
direttiva. Inoltre, Java considera alcuni problemi non fatali come errori (ad esempio, il codice non raggiungibile in Java genera un errore per un motivo che vorrei sapere).
C # non ha gli stessi problemi, ma ne ha alcuni. Sembra che la compilazione si verifichi in più passaggi e un errore di passaggio impedirà l'esecuzione degli ulteriori passaggi. Per questo motivo, il conteggio degli errori che si ottiene quando la compilazione fallisce è spesso gravemente sottovalutato. In una corsa potrebbe dire che hai due errori, ma una volta risolti, potresti averne 26 nuovi.
Scavare in C e C ++ mostra semplicemente una cattiva combinazione delle debolezze diagnostiche della compilazione di Java e C # (anche se potrebbe essere più preciso dire che Java e C # si sono appena fatti strada con metà dei problemi ciascuno). Alcuni avvisi dovrebbero davvero essere errori (ad esempio quando non tutti i percorsi di codice restituiscono un valore) e comunque sono avvertimenti perché, suppongo, al 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 lo standard dice, ma usano ancora il livello di errore di avviso "standard" per i risultati aggiuntivi. E spesso, i compilatori non segnalano immediatamente tutti gli errori che sono riusciti a trovare; potrebbero essere necessarie alcune compilazioni per sbarazzarsi di tutti. Per non parlare degli errori criptici che i compilatori C ++ amano sputare,
Ora aggiungendo che molti sistemi di compilazione sono configurabili per segnalare guasti quando i compilatori emettono avvisi, otteniamo solo uno strano mix: non tutti gli errori sono fatali ma alcuni avvisi 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.
I linguaggi non compilati hanno ancora la loro parte di segnalazioni errate di errori. Gli errori Typos in Python non verranno segnalati fino a quando il codice non verrà effettivamente eseguito e non sarà mai possibile espellere più di un errore alla volta perché lo script smetterà di essere eseguito dopo averne incontrato uno.
PHP, dalla sua parte, ha un sacco di livelli di errore più o meno significativi ed eccezioni. Errori grossolani vengono segnalati uno alla volta, gli avvisi sono spesso così negativi che dovrebbero interrompere lo script (ma non per impostazione predefinita), gli avvisi mostrano spesso gravi problemi logici, alcuni errori non sono abbastanza gravi da interrompere lo 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 della segnalazione degli errori del compilatore che mi viene in mente sia rotta. Il che è un vero peccato, dal momento che tutti i bravi programmatori insistono su quanto sia importante gestire correttamente gli errori e tuttavia non riescano a ottenere i propri strumenti per farlo.
Quale pensi che dovrebbe essere il modo giusto per segnalare errori del compilatore?