2015-08-16 34 views
10

Java bayt kodunu anlamaya çalışıyorum.İkili işleçler ne zaman Java'da gerçekleşir?

public class Test 
{ 
    public static void main(String args[]) 
    { 
     System.out.println(2 + 1); 
    } 
} 

ben derlenmiş bu sınıf: Ben basit bir örnekle başladı

javac Test.java 

Sonra böyle .class üzerinde javap çalıştı:

javap -c Test 

bana bunu verdi :

Compiled from "Test.java" 
public class Test { 
    public Test(); 
    Code: 
     0: aload_0  
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return   

    public static void main(java.lang.String[]); 
    Code: 
     0: getstatic  #2     // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: iconst_1  
     4: invokevirtual #3     // Method java/io/PrintStream.println:(I)V 
     7: return   
} 

Ben bu hat dışında, bunun dışında mantıklı mümkün olabilir:

2+1 
: benim kaynağına bakarak

public static void main(java.lang.String[]); 
. . . 
3: iconst_1  
. . . 

ve bu bayt kodu javactır gibi zaten bu deyimi için ek çalışmasını yapmış görünüyor

ve jvm'nin bu sabit değerini döndürmesini istemek.

Anlayışım yanlışsa, bir kişi beni düzeltebilir mi? Javac, gerçekte jvm üzerinde çalışmadan önce +, -, * vb. Için derleme işlemini gerçekleştirir mi? Öyleyse nasıl?

+2

Derleme süresinde optimize edilmiş bir sabittir. –

+0

"Nasıl" oldukça basit bir matematiktir. Derleyici, bunların sayıları olduğunu, değişemeyeceğini ve eklenebilir olduklarını biliyor. –

cevap

24

2 + 1, bir derleme zamanı sabit ifadesidir. Derleyici kendisi bayt kodunda 3 ile değiştirir.

Bazı ifadeler derleme sırasında tespit edilebilir bir değere sahip:

diyor Java Language Specification, bakınız. Bunlar sabit ifadelerdir.

sabit bir sentezleme aniden tamamlanmaz kullanılarak oluşan basit tür ve bir String bir değerini belirten bir ifade yalnızca şu sabit bir ifade biçimidir ne this other chapter bakınız:

basit tür ve tip String sabitinden
  • Değişmez [...]
  • katkı operatörleri + ve - [...]
+0

Yani tüm sabit ifadeler derleyici tarafından çözülüyor mu? – batman

+0

Evet, gerçekten .... –

+6

@batman evet, ancak '1 + 2 + i' ve 'i + 1 + 2 'nin' 3 + i' ve 'i + 1 + 2' şeklinde derleneceğini unutmayın. İlk durumda '(1 + 2) + i' yani (1 + 2) 'nin derleyici tarafından en iyi duruma getirilebildiği, ancak (i ​​+ 1) + 2'nin' 'durumunda olduğu işlem sırası nedeniyle olur. (i + 1) 'derleyici derleme zamanında' i' değerini bilmez, bu nedenle kodunuzu optimize etmez. – Pshemo

İlgili konular