同じJavaファイルが異なるJavaコンパイラによってコンパイルされた場合、バイトコードは同じになりますか?ソースJavaファイルは変更されません。
7 に答える
同じJavaファイルが異なるJVMでコンパイルされた場合、バイトコードは同じになりますか?ソースJavaファイルは変更されません。
あなたが何を意味するのかは完全には明らかではありませんが、答えはおそらく「いいえ」です。
JDKが異なれば、Javaコンパイラも異なり、同じソースコードに対して異なるバイトコードを出力する可能性があります。javacコンパイラは時間とともに進化してきました。
Javaのさまざまなメジャーバージョンは、クラスファイル仕様のさまざまなバージョンに準拠するクラスファイルを発行することがよくあります。
1つのJDKインストールに制限している場合でも、同じソースファイルでコンパイラを2回実行すると、同一ではない.classファイルが生成されます。(クラスファイルにはコンパイルタイムスタンプが含まれています...)
答えが「はい」になる唯一の方法は、コンパイルのタイムスタンプと(おそらく)他のメタデータを比較で無視し、同じターゲットバージョンのバイトコードを出力し、JDKバージョンがJavaに十分近い場合です。コンパイラのバイトコード生成はバージョン間で変更されていません。
全くない。
PS .: おそらく「JVM」ではなく「JDK」を意味します
バイト コードは、特定の JVM 実装の一部ではないJavaコンパイラによって生成されます。バイト コードは、JVM の実行エンジンによって実行される中間言語の名前であるため、JVM はこのコードを生成せずに実行します。JVM ができることは、バイト コードを異なるマシン コードにコンパイルすることです。このコンパイラは、ジャストインタイム (JIT) コンパイラと呼ばれます。
ただし、異なるバイト コードにつながる可能性があるのは、異なる Java コンパイラです。主なコンパイラは次の場所にリストされています。
いいえ。バイトコードは、使用するコンパイラによって異なりますが、仕様内でわずかに異なります。私は間違っているかもしれませんが、私が知る限り、変更は主にさまざまな JDK の javac がどのように最適化されるかに関連しています。とにかくバイトコードはJVMと相互運用可能です。
これは JVM 固有であり、JVM はどのプラットフォーム (OS) に存在します。いずれの場合も多少異なります。同じjvmで同じjavacを使用して同じソースを2回コンパイルすることについては知りません。誰にもアイデアはありますか?
いいえ、すべての新しい JDK で。一般に、Java コンパイラーも更新されて、コンパイル中に何らかの最適化を行います。異なる Java バージョンでコンパイルすると、バイトコードは異なります。
はい、ただし:com.sun
などのパッケージを使用すると、プロプライエタリであるため、問題が発生する可能性があります。
さらに、しばらく前に、Sun JDK と IBM JDK で Object(In|Out)putStream の動作が異なることに遭遇しましたが、おそらくそこで何か間違ったことをしたので、これについてはわかりません。
証明: http://docs.oracle.com/javase/specs/ - Java Virtual Machine Specification、Java SE 7 Edition
Update: 申し訳ありません。実際、まったく同じバイトコードではありませんが、認定されたすべての JVM はそれを理解し、同じ結果を返します。