私は近い将来にコンパイラを書くつもりはありません。それでも、私はコンパイラ技術に非常に興味があり、このようなものをどのように改善することができますか。
コンパイルされた言語から、ほとんどのコンパイラには2つのエラーレベルがあります。最初はほとんどの場合、修正する必要のある致命的ではない警告とエラー、およびマシン(またはバイト)入力からのコード。
しかし、これはかなり弱い定義です。Javaのような一部の言語では、@SuppressWarning
ディレクティブを使用せずに特定の警告を取り除くことは不可能です。また、Javaは致命的ではない特定の問題をエラーとして扱います(たとえば、Javaの到達不能コードは、知りたい理由でエラーをトリガーします)。
C#には同じ問題はありませんが、いくつかあります。コンパイルは複数のパスで発生し、パスが失敗すると以降のパスは実行されないようです。そのため、ビルドが失敗したときに取得するエラーカウントは、しばしば大幅に過小評価されます。1回の実行で2つのエラーがあると表示される場合がありますが、修正すると26の新しいエラーが発生する可能性があります。
CとC ++を掘ると、JavaとC#のコンパイル診断の弱点の悪い組み合わせが示されるだけです(ただし、JavaとC#はそれぞれ半分の問題で進んだと言う方が正確かもしれません)。いくつかの警告は実際にはエラーである必要があり(たとえば、すべてのコードパスが値を返すわけではない場合)、それでも警告です。標準を書いた時点では、コンパイラテクノロジはこれらの種類の必須チェック。同じように、コンパイラは多くの場合、標準で規定されている以上のことをチェックしますが、追加の検出には「標準」の警告エラーレベルを使用します。また、多くの場合、コンパイラはすぐに検出できるすべてのエラーを報告しません。それらをすべて削除するには、数回のコンパイルが必要になる場合があります。C ++コンパイラーが吐き出すのを好む不可解なエラーは言うまでもありませんが、
コンパイラーが警告を発したときに失敗を報告するように多くのビルドシステムを構成できるようになったので、奇妙なミックスが得られます。すべての警告に値するわけではありませんが、警告の存在をさらに言及せずにいくつかの警告を明示的に抑制しています。また、すべての警告がエラーになる場合があります。
コンパイルされていない言語には、依然としてエラー報告があります。Pythonのタイプミスは、コードが実際に実行されるまで報告されません。また、スクリプトがエラーを検出すると実行が停止するため、一度に複数のエラーをキックすることはできません。
PHPには、多かれ少なかれ重要なエラーレベルと例外がたくさんあります。解析エラーは一度に1つずつ報告され、警告はスクリプトを中断するほどひどい場合があります(ただし、デフォルトではそうではありません)。 PHPの場合と同じように、本当に奇妙なことがあります(なぜ致命的ではない致命的なエラーのエラーレベルが必要なのでしょうか?E_RECOVERABLE_E_ERROR
、私はあなたに話しています)。
私が考えることができるコンパイラエラーレポートのすべての実装が壊れているように思えます。すべての優秀なプログラマーが、エラーに適切に対処することの重要性を主張しているにもかかわらず、それを行うための独自のツールを入手できないため、これは本当に残念です。
コンパイラエラーを報告する正しい方法は何だと思いますか?