Nasz projekt wykonuje niektóre oprzyrządowanie kodu bajtowego Java. I natknęliśmy się na dziwne zachowanie. Załóżmy, że następujący fragment kodu:Różnice w bajtach kodu Java opracowane przez kompilatory Oracle i Eclipse:
public void a() {
new Integer(2);
}
javac Oracle kompiluje powyższe pod następującym kodu bajtowego:
0: new #2; //class java/lang/Integer
3: dup
4: iconst_2
5: invokespecial #3; //Method java/lang/Integer."<init>":(I)V
8: pop
9: return
i kompilatora w Eclipse:
0: new #15; //class java/lang/Integer
3: iconst_2
4: invokespecial #17; //Method java/lang/Integer."<init>":(I)V
7: return
Jak widać, Oracle kompilator produkuje "dup" po "nowym", podczas gdy Eclipse nie. Które jest całkowicie poprawne w tym przypadku użycia, ponieważ nowo utworzona instancja Integer nie jest w ogóle używana, więc nie jest wymagane "dup".
Moje pytania są następujące:
- Czy jest jakiś opis różnic pomiędzy różnymi kompilatory? Artykuł/post na blogu?
- Czy mogę bezpiecznie wywnioskować, że jeśli nie ma "dup" między "nowy" i "invokespecial", to obiekt nie jest używany po inicjalizacji?
Jaki jest Twój cel w zakresie oprzyrządowania kodu bajtowego? Czy ta różnica powoduje u Ciebie problem? Zauważ, że nie ma gwarancji co do tego, jaki kod bajtowy będzie produkował dokładnie kompilator Java.Jest całkiem możliwe, że w przyszłej wersji Oracle 'javac' będzie produkować coś innego niż to, co widzisz teraz - więc nie jest dobrym pomysłem napisanie programu, który w dużym stopniu opiera się na dokładnym kodzie bajtowym generowanym przez kompilator. – Jesper
Czy używasz różnych JDK dla Eclipse? – Nishant