2012-03-29 10 views
6

現在、大規模なプロジェクト(約2,000のソースファイル)用のビルドシステムをすべて再作成する過程にあります。ファイルのバイナリ比較を行い、すべてが正しいことを確認します。次の質問:javacの出力は、コンパイル全体で同じであることが保証されているのですか、それとも変更される可能性がありますか?javacで生成されるクラスファイルは常に同じですか?

Another questionは、定数プールの順序が異なる可能性があることを暗示していますが、javacコールに入るファイルの順序を制御できると仮定すると、まだ違いがありますか? AntとMavenをビルドの一部として使用しています。

+2

保証されません。実際には、同一のコンパイラとコンパイル時のJAR構造を使用すると、おそらくは同じになりますが、JARの順序などを少し変更してもapplecartが動揺する可能性があります。 –

+0

あなたのテストでは機能的な等価性が保証されないでしょうか?それはあなたが実際に心配しているものですか?いずれにせよ、それを試してみて、何が起こるかを見てみましょう。あなたがものが並べ替えられたことが分かった場合は、バイトコードに相当するかどうかを確認するためにバイトコード分析を行います。 –

+0

ビルドされたクラスのバイナリ比較がなぜ必要なのでしょうか? –

答えて

3

バイトコードが絶対にが同じであることが保証されていません。コンパイラは保証された動作に影響を与えない最適化を実行できます。 Java言語仕様では、コンパイラが実行する可能性のある最適化についてもいくつか言及しています。例えば、文字列連結演算子+で、それはノート:

実装を作成した後、中間体Stringオブジェクトを破棄を回避するために、1つのステップで変換及び連結を実行することを選択することができます。反復文字列連結のパフォーマンスを向上させるために、JavaコンパイラはStringBufferクラスまたは同様の手法を使用して、式の評価によって作成される中間のStringオブジェクトの数を減らすことができます。

[link]

0

私は、コンパイラの専門家ではないが、私は、バイナリ比較が100%信頼できるものではないことを言って他の回答を信じる傾向にあります。

私は、ビルドシステムが作成する成果物(.jars & .warsなど)を検査し、それぞれが期待される内容を持っていることを確認し、各ファイルのサイズかなり厳しい許容範囲内です。

ビルドスクリプトがソースを生成してコンパイルしている場合は、生成されたソースとの比較が可能でなければなりません。がビルドからビルドまで100%安定します。 (または少なくとも予測可能)。

希望すると便利です。

0

、同値は、いくつかのクラスファイルのパーサの一つ取得することです保証ファイルを解析するための唯一の方法は、定数プール順変化による違いを考え出すの重い作業を行います、主な問題は、定数プールを並べ替えることで、定数を参照する数値が変更され、そのうちのいくつかはテーブル要素にあり、そのうちのいくつかはバイトコードであることです。あなたがすでに他の理由(バイトコードの変更など)のためにフレームワークの大部分を持っていない限り、おそらく実用的ではないでしょう。

関連する問題