2015-08-16 12 views
10

Sto cercando di capire il codice byte java. Ho iniziato con semplice esempio:Quando l'esecuzione degli operatori binari avviene in Java?

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

ho compilato questa classe:

javac Test.java 

E poi ho cercato di un javap sulle .class come questo:

javap -c Test 

che mi ha dato questo :

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   
} 

ho potuto in grado di dare un senso fuori di esso, oltre a questa linea:

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

guardando la mia fonte e questo codice di byte, si presenta come javac già fatto l'operazione di aggiunta per questa dichiarazione:

2+1 

e chiedere a jvm di restituire quella costante.

Qualcuno può correggermi se la mia comprensione è sbagliata? Javac esegue l'operazione su compilazione per +, -, * ecc prima che funzioni effettivamente su jvm? Se é cosi, come?

+2

È un costante, ottimizzato in fase di compilazione. –

+0

Il "come" è piuttosto facile-matematica. Il compilatore sa che sono numeri, non possono cambiare e sono addendabili. –

risposta

24

2 + 1 è un'espressione costante in fase di compilazione. Il compilatore stesso lo sostituisce di 3 nel codice byte.

Vedere il Java Language Specification, che dice:

Alcune espressioni hanno un valore che può essere determinato al momento della compilazione. Queste sono espressioni costanti.

Vedere this other chapter per ciò che costituisce un'espressione costante

Un'espressione costante è un'espressione che denota un valore di tipo primitivo o una stringa che non completano bruscamente ed è composto utilizzando solo i seguenti:

  • letterali di tipo primitivo e letterali di tipo String [...]
  • Gli operatori additivi + e - [...]
+0

Quindi tutte le espressioni costanti vengono risolte dal compilatore? – batman

+0

Sì, infatti .... –

+6

@batman sì, ma si noti che '1 + 2 + i' e' i + 1 + 2' saranno compilati come '3 + i' e' i + 1 + 2'. Succede a causa di un ordine di operazione che nel primo caso è '(1 + 2) + i' così' (1 + 2) 'può essere ottimizzato dal compilatore, ma nel caso di' (i + 1) + 2' in ' (i + 1) 'Il compilatore non può conoscere il valore di' i' al momento della compilazione, quindi non ottimizzerà il tuo codice. – Pshemo

Problemi correlati