2015-08-16 13 views
10

Próbuję zrozumieć kod bajtowy Java. Zacząłem od prostego przykładu:Kiedy wykonywanie operatorów binarnych odbywa się w Javie?

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

Skompilowałem tej klasie:

javac Test.java 

A potem próbowałem do javap na .class tak:

javap -c Test 

co dało mi to :

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   
} 

mogłem stanie sensu z niego, oprócz tej linii:

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

patrząc na moje źródła i tego kodu bajtowego, wygląda javac zrobiono operację dodawania do tego stwierdzenia:

2+1 

i prosząc jvm o zwrócenie tej stałej.

Czy ktoś może mnie poprawić, jeśli moje zrozumienie jest błędne? Czy javac wykonuje operację kompilacji dla +, -, * itd. Zanim faktycznie uruchomi jvm? Jeśli tak to jak?

+2

Jest to stała, zoptymalizowana podczas kompilacji. –

+0

"Jak" jest całkiem łatwe do matematyki. Kompilator wie, że są to liczby, których nie można zmienić i są one do dodania. –

Odpowiedz

24

2 + 1 jest wyrażeniem stałym w czasie kompilacji. Sam kompilator zamienia go na 3 w bajtowym kodzie.

Zobacz Java Language Specification, który mówi:

Niektóre wyrażenia posiadają wartość, która może być ustalona w czasie kompilacji. Są to wyrażenia stałe.

Zobacz this other chapter za to, co stanowi stałym wyrażeniem

Stała ekspresyjny wyraz oznaczający wartość prymitywnego typu lub ciąg znaków, który nie kończy się nagle i składa się tylko przy użyciu następujących:

  • Literówki prymitywnego rodzaju i literałów typu string [...]
  • operatorzy dodatków + i - [...]
+0

A więc całe wyrażenie stałe jest rozwiązywane przez kompilator? – batman

+0

Tak, rzeczywiście .... –

+6

@batman tak, ale zauważ, że '1 + 2 + i' oraz' i + 1 + 2' zostaną skompilowane jako '3 + i' oraz' i + 1 + 2'. Zdarza się to z powodu kolejności działania, która w pierwszym przypadku to '(1 + 2) + i' tak więc' (1 + 2) 'może być zoptymalizowane przez kompilator, ale w przypadku' (i + 1) + 2' w ' (i + 1) 'kompilator nie może znać wartości' i' w czasie kompilacji, więc nie zoptymalizuje twojego kodu. – Pshemo

Powiązane problemy