Ich habe nicht vor, in naher Zukunft einen Compiler zu schreiben. Trotzdem interessiere ich mich sehr für Compilertechnologien und wie dieses Zeug besser gemacht werden könnte.
Beginnend mit kompilierten Sprachen haben die meisten Compiler zwei Fehlerstufen: Warnungen und Fehler, wobei die erste meistens nicht schwerwiegende Probleme sind, die Sie beheben sollten, und Fehler, die meistens darauf hinweisen, dass es unmöglich ist, Maschinen- (oder Byte-) zu erzeugen. Code von der Eingabe.
Dies ist jedoch eine ziemlich schwache Definition. In einigen Sprachen wie Java können bestimmte Warnungen ohne Verwendung der @SuppressWarning
Direktive einfach nicht entfernt werden . Außerdem behandelt Java bestimmte nicht schwerwiegende Probleme als Fehler (z. B. löst nicht erreichbarer Code in Java einen Fehler aus einem Grund aus, den ich gerne wissen möchte).
C # hat nicht die gleichen Probleme, aber einige. Es scheint, dass die Kompilierung in mehreren Durchgängen erfolgt und ein fehlgeschlagener Durchgang die Ausführung der weiteren Durchgänge verhindert. Aus diesem Grund wird die Fehleranzahl, die Sie erhalten, wenn Ihr Build fehlschlägt, häufig stark unterschätzt. Bei einem Durchlauf könnte es heißen, dass Sie zwei Fehler haben, aber wenn Sie diese behoben haben, erhalten Sie möglicherweise 26 neue.
Das Graben in C und C ++ zeigt einfach eine schlechte Kombination der Schwachstellen bei der Kompilierungsdiagnose von Java und C # (obwohl es genauer sein könnte zu sagen, dass Java und C # jeweils nur die Hälfte der Probleme gelöst haben). Einige Warnungen sollten eigentlich Fehler sein (zum Beispiel, wenn nicht alle Codepfade einen Wert zurückgeben), und dennoch sind sie Warnungen, da die Compilertechnologie zum Zeitpunkt der Erstellung des Standards vermutlich nicht gut genug war, um diese Art von zu erstellen Schecks obligatorisch. In der gleichen Weise prüfen Compiler häufig, ob mehr als der Standard angibt, verwenden jedoch für die zusätzlichen Ergebnisse die Warnfehlerstufe "Standard". Und oft melden Compiler nicht alle Fehler, die sie finden könnten, sofort. Es kann einige Kompilierungen erfordern, um alle zu entfernen. Ganz zu schweigen von den kryptischen Fehlern, die C ++ - Compiler gerne ausspucken.
Wenn wir nun hinzufügen, dass viele Build-Systeme konfigurierbar sind, um Fehler zu melden, wenn die Compiler Warnungen ausgeben, erhalten wir nur eine seltsame Mischung: Nicht alle Fehler sind schwerwiegend, aber einige Warnungen sollten; Nicht alle Warnungen sind verdient, aber einige werden ausdrücklich unterdrückt, ohne dass ihre Existenz weiter erwähnt wird. und manchmal werden alle Warnungen zu Fehlern.
Nicht kompilierte Sprachen haben immer noch ihren Anteil an beschissenen Fehlerberichten. Tippfehler in Python werden erst gemeldet, wenn der Code tatsächlich ausgeführt wird, und Sie können nie mehr als einen Fehler gleichzeitig auslösen, da das Skript nicht mehr ausgeführt wird, nachdem es einen Fehler erfüllt.
PHP hat auf seiner Seite eine Reihe von mehr oder weniger signifikanten Fehlerstufen und Ausnahmen. Analysefehler werden einzeln gemeldet, Warnungen sind oft so schlecht, dass sie Ihr Skript abbrechen sollten (aber nicht standardmäßig), Benachrichtigungen zeigen sehr oft schwerwiegende logische Probleme, einige Fehler sind wirklich nicht schlimm genug, um Ihr Skript zu stoppen, aber dennoch tun, und wie bei PHP üblich, gibt es dort unten einige wirklich seltsame Dinge (warum zum Teufel brauchen wir eine Fehlerstufe für schwerwiegende Fehler, die nicht wirklich schwerwiegend sind? E_RECOVERABLE_E_ERROR
Ich spreche mit Ihnen).
Es scheint mir, dass jede einzelne Implementierung der Compiler-Fehlerberichterstattung, die mir einfällt, fehlerhaft ist. Das ist eine echte Schande, denn alle guten Programmierer bestehen darauf, wie wichtig es ist, mit Fehlern richtig umzugehen, und können dennoch keine eigenen Tools dafür bekommen.
Was sollte Ihrer Meinung nach der richtige Weg sein, um Compilerfehler zu melden?