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?
Jest to stała, zoptymalizowana podczas kompilacji. –
"Jak" jest całkiem łatwe do matematyki. Kompilator wie, że są to liczby, których nie można zmienić i są one do dodania. –