2015-05-22 14 views
9

Java Derleyicisi'nin perspicacity'sini kontrol etmeye karar verdim; bu yüzden basit bir sınıf yazdım.Java'da "if" koşullarının garip optimizasyonu

if (a == true) {} 

ben sınıfını derlenmiş ve daha sonra javap aracıyla sökülüp:

public class Foo { 
    public Foo(boolean a, int b) { 
     if (a == true && a != false) { 
      b = 1; 
     } 
    } 
} 

Ben derleyici gibi basit bir şey için durumu optimize edip merak ediyorum. Çıktıya baktığımda, gerçekten çok şaşırdım, çünkü derleyici, bu koşulların her ikisini de kontrol ediyor, aşağıda açıkça gösteriliyor. daha basit bir şey için optimize edilebilir zaman ben sadece merak ediyorum

Compiled from "Foo.java" 
public class Foo { 
    public Foo(boolean, int); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: iload_1 
     5: iconst_1 
     6: if_icmpne  15 
     9: iload_1 
     10: ifeq   15 
     13: iconst_1 
     14: istore_2 
     15: return 
} 

, neden, gereksiz komutları yerine getirmek edilir?

+1

Yaygın kullanım durumu olması gerekmiyor. Derleyiciler, hiçbir anlam ifade etmeyen şeyleri derlemeyi ve engellemeyi amaçlar. – itachi

+1

@itachi Gerçekten değil. Kod yazmanın birçok yolu vardır ve bunların tümü için yazım optimizasyonları derleyiciyi korumak ve hataları düzeltmek için zorlaştırır. – RealSkeptic

+0

Minecraft'ı tamamen tersine çevirdikten sonra, Java'nın çok azını, varsa, semantik optimizasyonlar yaptığını rahatlıkla söyleyebilirim. – Qix

cevap

13

javac, yalnızca küçük bir iyileştirme yapmaz ya da sadece küçük bir optimizasyon yapmaz. Optimizasyon, bayt kodunun tam zamanında (JIT) derlenmesi sırasında meydana gelir. Bu, mantıklı bir yaklaşımdır, çünkü bu yaklaşımla farklı hedef platformlar için farklı optimizasyonlar yapabilir ve maksimum optimizasyon sonuçları elde edebilirsiniz.