Je n'ai pas l'intention d'écrire un compilateur dans un avenir proche; malgré tout, je suis assez intéressé par les technologies de compilation et comment ces choses pourraient être améliorées.
À partir des langages compilés, la plupart des compilateurs ont deux niveaux d'erreur: les avertissements et les erreurs, le premier étant la plupart du temps des éléments non fatals que vous devez corriger, et des erreurs indiquant la plupart du temps qu'il est impossible de produire une machine (ou des octets). code de l'entrée.
Cependant, c'est une définition assez faible. Dans certains langages comme Java, certains avertissements sont tout simplement impossibles à supprimer sans utiliser la @SuppressWarning
directive. De plus, Java traite certains problèmes non fatals comme des erreurs (par exemple, du code inaccessible en Java déclenche une erreur pour une raison que j'aimerais savoir).
C # n'a pas les mêmes problèmes, mais il en a quelques-uns. Il semble que la compilation se déroule en plusieurs passes, et une passe échouant empêchera les autres passes de s'exécuter. Pour cette raison, le nombre d'erreurs que vous obtenez lorsque votre build échoue est souvent largement sous-estimé. Sur une seule exécution, il se peut que vous ayez deux erreurs, mais une fois que vous les aurez corrigées, vous en obtiendrez peut-être 26 nouvelles.
Creuser en C et C ++ montre simplement une mauvaise combinaison sur Java et les faiblesses de diagnostic de compilation de C # (bien qu'il soit peut-être plus précis de dire que Java et C # se sont contentés de la moitié des problèmes chacun). Certains avertissements devraient vraiment être des erreurs (par exemple, lorsque tous les chemins de code ne renvoient pas une valeur) et ils sont toujours des avertissements car, je suppose, au moment où ils ont écrit la norme, la technologie du compilateur n'était pas assez bonne pour faire ce genre de chèques obligatoires. Dans la même veine, les compilateurs vérifient souvent plus que la norme ne le dit, mais utilisent toujours le niveau d'erreur d'avertissement "standard" pour les résultats supplémentaires. Et souvent, les compilateurs ne signalent pas immédiatement toutes les erreurs qu'ils ont pu trouver; cela peut prendre quelques compiles pour se débarrasser de tous. Sans parler des erreurs cryptiques que les compilateurs C ++ aiment cracher,
Ajoutant maintenant que de nombreux systèmes de build sont configurables pour signaler les échecs lorsque les compilateurs émettent des avertissements, nous obtenons juste un mélange étrange: toutes les erreurs ne sont pas fatales mais certains avertissements devraient; tous les avertissements ne sont pas mérités mais certains sont explicitement supprimés sans autre mention de leur existence; et parfois tous les avertissements deviennent des erreurs.
Les langues non compilées ont toujours leur part de rapports d'erreurs de merde. Les fautes de frappe en Python ne seront pas signalées tant que le code ne sera pas réellement exécuté, et vous ne pourrez jamais vraiment supprimer plus d'une erreur à la fois car le script cessera de s'exécuter après en avoir rencontré une.
PHP, de son côté, a un tas de niveaux d'erreur plus ou moins importants et d' exceptions. Les erreurs d'analyse sont signalées une par une, les avertissements sont souvent si mauvais qu'ils devraient abandonner votre script (mais ne le font pas par défaut), les notifications montrent souvent de graves problèmes de logique, certaines erreurs ne sont vraiment pas assez graves pour arrêter votre script mais tout de même faire, et comme d'habitude avec PHP, il y a des choses vraiment étranges là-bas (pourquoi diable avons-nous besoin d'un niveau d'erreur pour les erreurs fatales qui ne sont pas vraiment fatales?, E_RECOVERABLE_E_ERROR
je vous parle).
Il me semble que toutes les implémentations de rapports d'erreurs du compilateur auxquelles je peux penser sont cassées. Ce qui est vraiment dommage, car tous les bons programmeurs insistent sur l'importance de traiter correctement les erreurs et ne peuvent pas obtenir leurs propres outils pour le faire.
Selon vous, quelle devrait être la bonne façon de signaler les erreurs du compilateur?