web-dev-qa-db-ja.com

コンパイラーとインタープリターにバグはありますか、そして(ユーザーとして)私たちはそれらに対処するために何ができますか?

コンパイラーの作業が基本的にソースコードをマシンレベルのコードに変換する場合、コンパイラーにグリッチ、つまり「変換」の欠陥がある可能性があります。

インタプリタについても同じことが言えます。必要なコンテンツを出力できないことがありますか?

コンパイラー/インタープリターのバグについて聞いたことがありませんが、バグは存在しますか?

28
Witch-King

はい

活発に開発されている言語では、比較的成熟している(したがって、大きな変化が見られない)言語よりもそれらを見つける傾向があります。頻繁に)。これがおそらく、ほとんどの言語が安定性のさまざまな「段階」でリリースされる理由です。夜間ビルドはリリース候補よりも安定性がはるかに低く、それ自体は完全にリリースされてアクティブに使用されているバージョンよりも安定性が低くなります。

幸いなことに、これらの言語のほとんど(特にオープンソースの言語)には、レポートを送信できるパブリックバグ追跡システムがあります。

私自身の経験で、私は =かなり不明瞭ですが重大なバグScala on Windows に遭遇しました。発見結果をバグトラッカーに送信し、問題はかなり迅速に修正されましたその場合、言語開発者は十分に賢く、エラーログの出力に役立つメモを含めることができました。私が遭遇したのは、実際にはコンパイラエラーであり、レポートの送信先を示しました。

51
KChaloux

素人の言葉で:

すべてのプログラムにバグがある可能性があります。

コンパイラはプログラムです。

エルゴ、コンパイラにはバグがあるかもしれません。

100

ハードウェアにもバグがある可能性があります。有名な例は Pentium FDIVバグ です。間違いなく、コンパイラにバグが含まれている可能性があります。

22
m3th0dman

コンパイラとインタプリタもソフトウェアなので、他のソフトウェアの問題から解放されません。

これは、最近のMSVC 11(2012)のコンパイラの例です 、および バックエンドのテスト方法に関する記事 です。

8
Joel

もちろん、コンパイラはソフトウェアなので。

2005年に、大企業向けに作成した非常に重要なソフトウェアの一部でコードが失敗しました。それは会社が修正するために文字通り数百万ドルを要したので、彼らはもちろん大規模な調査を始めました。

ありがたいことに(私の観点から)、この問題はDelphiのコンパイラの問題であることが判明しました。 try finallyブロックでは、関数の戻り値が破棄され、完全にランダムな結果が呼び出し元に返されました。これは文書化され、ボーランドによって承認されました。

.NETは、特に初期の実装において、文字通り数百の異なるメモリリークがあることがよく知られていました。

私はバグのないソフトウェアのようなものはないと主張します。コンパイラも例外ではありません。ただし、ほとんどのビジネスソフトウェアよりも徹底的にテストされており、賢く、批判的で、論争のある人々によって利用されているため、実際には、全体として、実績はかなり良好です。

4
Curt

バグだけでなく、意図的なマルウェアも含まれます。

Brian KernighanがオリジナルのUnix Cコンパイラに実装した「ログイン」トロイの木馬は、これらの中で最もよく知られています。記事 http://cm.bell-labs.com/who/ken/trust.html には、これに関する背景があります。

2
Juha Laiho

もちろん、どのソフトウェアコンパイラにもバグがあります。たとえば、gccバグリストは here です。

1
JohnB

はい。

また、コンパイラだけでなく、インタプリタ/デバッガ、およびサードパーティのソフトウェアツールも使用できます。

現在、一部のサードパーティソフトウェアを使用しており、一部の問題が発生しています。時々彼らは私たちにバグを見つけて報告してくれたことに感謝します。 :)

それらの一部には、メモリリークもあり、クラッシュにつながります。ここでの重要な質問は、サードパーティツールまたはコンパイラに、アプリケーションが正しく動作するためのバグがあるかどうかをどのように判断するかです。

0
JNL

コンパイラは、ある言語(ソース言語)で記述されたプログラムを読み取り、それを別の言語(ターゲット言語)の別の同等のプログラム(ほとんどが機械語)に変換するプログラムです。

コンパイラーにはさまざまなフェーズがあり、ソース言語コードが1行ずつスキャンされます。ソース言語コードでスキャンされるすべてのキーワードを追跡するシンボルテーブルがあります。

フェーズ1:字句解析器-ソースプログラムのすべての文字を読み取り、トークン(int、char、float、if-else、for、whileなど)の論理的な分離を形成します。

フェーズ2:Syntax Analyzer-トークンのストリームの構造を分析します。接尾辞/接頭辞などを含む式の階層的解析(a = b + c * d)

フェーズ3:セマンティックアナライザー-トークンの型チェック(整数から実数、浮動小数点数など)および演算子の優先順位などの多くのこと。

フェーズ4:中間コードジェネレータ-a = b + c * d-e(temp1 = c * d、temp2 = temp1 + b、temp3 = temp2-e)

フェーズ5:コードの最適化-さまざまな分析(制御フロー、データフロー、変換)
排除する:冗長コード、定数の伝播、部分的なデッドコード、共通の部分式、ループ不変コード

フェーズ6:コード生成-レジスタに値を入力するターゲットコード(主にアセンブリ言語)の生成

これらのフェーズはすべて、適切に記述されたプログラムに過ぎず、N個の欠陥が存在する可能性があります。

0