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?
Derleme süresinde optimize edilmiş bir sabittir. –
"Nasıl" oldukça basit bir matematiktir. Derleyici, bunların sayıları olduğunu, değişemeyeceğini ve eklenebilir olduklarını biliyor. –