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


201

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

回答:


209

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

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

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

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

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


3
@ Bart、Eclipseコンパイラーはエンタープライズリリースビルドに十分対応できます。
jjnguy

7
@jinguyリリースにはEclipseコンパイラを使用するべきだと思いません。あなたが答えで述べたように、それはエラーでコードをコンパイルすることができます、あなたはpublic void foo(){throw new Error( "Unresolved compilation problem:\ n \ tFOOBAR cannot be resolved \ n"のようなものを望まないでしょう); 私の製品コードに表示されます。
マシューファーウェル、2011

10
@マシュー・ファーウェル彼はあなたがそうすべきだとは言いませんでしたが、それは可能です。エラーが発生したビルドを作成した場合、そもそもビルドプロセスに問題があります。
Stefan

4
アプリケーションにECJを埋め込むと、JDKを必要とせずにプログラムをJREで実行できることに注意してください。
–ThorbjørnRavn Andersen 2015

6
@MatthewFarwellはここでループを閉じます。リリースビルドの場合、コンパイラー引数を指定しないことをお勧めします-proceedOnError。これにより、エラーのあるソースから.classファイルが生成されなくなります。
Stephan Herrmann、2015

36

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

コンパイル時最適化関連

ジェネリック型推論関連


1
実際、私は長い夜の後にこの違いを知っていました:Eclipseは私にとって合法であるように思われる(私は何を覚えていない)何かについてのエラーを報告していましたその後、スムーズに動作しました!その問題の修正を取得するには、JDTをアップグレードする必要があることがGoogleでわかりました。
アベルモレロス

5
コンパイラーがジェネリックを処理する際に、困難な場合にいくつかの違いがあることを発見しました。:ここでは、2つは、私はあなたがあなたの答えにそれらを追加したい場合、ここで約質問作られて stackoverflow.com/questions/13501836/...の stackoverflow.com/questions/13980552/...
エリアスVasylenkoを

5
JLSによると、匿名クラスは静的ではありませんが、静的スコープで宣言できます。リフレクションを使用してそのようなクラスが静的であるかどうかを尋ねると、ECJの生成されたコードはnoを示し、javac はyesを示します。関連記事はこちら
Paul Bellora 2013

2
生成されたバイトコードの意味上の違いは、どちらの実装でもバグです。これは私の意見ではあまり興味深いものではありません。javacとecjの未解決のバグをリストするだけで、そのような「違い」の長いリストを簡単に作成できます。
aioobe 2014年

参考までに、Netbeansはjavacの内部APIを使用してEJCが行うすべてのことを行うため、このような「違い」の影響を受けません。
Aleksandr Dubinsky

17

Eclipseの組み込みコンパイラは、IBMのJikes Javaコンパイラに基づいています。(EclipseもIBMで生まれました)。JDKのSunのJavaコンパイラから完全に独立しています。Sunのラッパーではありませんjavac

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


31
彼らは実際には独自のJavaコンパイラーを作成していませ。Eclipseは、Javaが存在する前からVisual Age for Smalltalkに長い歴史を持っています。2つの言語は実際にはいくぶん似ているので、既存のテクノロジーを単に適合させただけです。また、Sunのコンパイラは、IDEでの使用、特に元のVisual Age for JavaのようなインクリメンタルSmalltalkスタイルのIDEでは、常にファイル全体をコンパイルする必要があるため、まったく不適切です。IBMのコンパイラーは、変更されたフラグメントのみを増分コンパイルできます。それも、で使用されていても正当なJava、ではありませんスニペットコンパイルすることができます
イェルクWミッターク

2
Eclipseは、あなたは、単に、コードのスニペットを書き、それらを強調表示し、クラス、メイン方法、あるいは方法ににそれらを配置することなく、それらを実行できる場所スクラップブックすべてで
イェルクWミッターク

1
@JörgWMittag実際、javacの内部API(Netbeansで使用)を使用して、同じ目標をすべて達成できます。
Aleksandr Dubinsky

1
@AleksandrDubinsky:Visual Age for Javaがリリースされた1997年に実際にうまくいったかどうか。
イェルクWミッターク

15

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

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


「わずかに」壊れたコードのコンパイルが必要なのはなぜですか?
スティーブコーエン

5
@SteveCohen:コンパイラーに構文の強調表示、セマンティックな強調表示、リファクタリングのサポート、型チェック、コード補完、ヒント、およびコードの作成中とコードの作成中にコンパイラーが行うその他すべての機能を提供するため、定義上、多かれ少なかれ不完全です(そうでない場合、なぜそれをまだ作成しているのですか?)プロジェクトの最後でのみ機能するIDE(すべてが既に実装されている場合)は、まったく役に立ちません。
イェルクWミッターク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.