web-dev-qa-db-ja.com

javacとEclipseコンパイラの違いは何ですか?

EclipseのJavaコンパイラは、javacプログラムがラップされているのと同じコアの単なるラッパーですか、それとも完全に別個のコンパイラですか?後者の場合、なぜ彼らは車輪を再発明するのでしょうか?

191

Eclipseは、 Eclipse Compiler for Java (ECJ)と呼ばれる独自のコンパイラーを実装しています。

Sun JDKに同梱されているコンパイラであるjavacとは異なります。注目すべき違いの1つは、Eclipseコンパイラーを使用すると、実際に正しくコンパイルされなかったコードを実行できることです。エラーのあるコードブロックが実行されない場合、プログラムは正常に実行されます。それ以外の場合、コンパイルされないコードを実行しようとしたことを示す例外がスローされます。

もう1つの違いは、EclipseコンパイラーはEclipse IDE内からのインクリメンタルビルドを許可することです。つまり、入力を完了するとすぐにすべてのコードがコンパイルされます。

Java SDKをインストールしなくてもEclipseでJavaコードを記述、コンパイル、実行できるため、Eclipseに独自のコンパイラーが付属していることも明らかです。

ECJがjavacより優先されるいくつかの例は次のとおりです。

200
jjnguy

誰もが彼らが異なっていることをすでに説明しています。 2つのコンパイラー間で気づいた動作の違いを次に示します。それらはすべて(少なくとも)1つの実装のバグに要約されます。

コンパイル時の最適化関連

ジェネリック型推論関連

36

Eclipseの組み込みコンパイラは、IBMの Jikes Javaコンパイラ に基づいています。 (EclipseもIBMでその生活を開始したことに注意してください)。 JDKのSunのJavaコンパイラから完全に独立しています。 Sunのjavacのラッパーではありません。

Jikesは長い間存在しており、以前は標準のJDK Javaコンパイラよりもずっと高速でした(しかし、それがまだ当てはまるかどうかはわかりません)。 IBMが独自のJavaコンパイラを作成したかった理由については、おそらくライセンス上の理由によるものです(独自のJava実装もあります)。

17
Jesper

それは完全に別個のコンパイラです。これは、javacが Eclipseサイト からのわずかに壊れたコードのコンパイルを許可しないために必要です。

インクリメンタルJavaコンパイラ。 Eclipseビルダーとして実装され、VisualAge for Javaコンパイラーから進化したテクノロジーに基づいています。特に、未解決のエラーがまだ残っているコードを実行およびデバッグできます。

14
BenM