Saranno i Java compilatore precalculate somme di letterali?
-
29-09-2019 - |
Domanda
int i = 10 + 20;
E 'vero che il compilatore elaborerà questo codice, aggiungendo 10 + 20
, e il codice byte è lo stesso che per questa riga di codice?
int i = 30;
Dove posso leggere in proposito?
Soluzione
Sì, e si può anche verificare in prima persona. Prendete un piccolo file Java, ad esempio:
public class Main {
public Main() {
int i = 10 + 20;
}
}
compilarlo con javac Main.java
, e javap -c Main
poi correre a smontarlo:
Compiled from "Main.java"
public class Main extends java.lang.Object{
public Main();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: bipush 30
6: istore_1
7: return
}
Chiaramente nel bytecode, si può vedere l'ottimizzazione del compilatore:! bipush 30
Altri suggerimenti
Sì. Questa ottimizzazione del compilatore è chiamato ripiegamento costante . C'è un altro ottimizzazione del compilatore chiamato sparse condizionale costante di propagazione che fa qualcosa di simile.
In generale, non c'è alcuna garanzia che un dato compilatore effettivamente piega costanti, ma al giorno d'oggi quasi tutti compilatore per ogni lingua fa questo. In particolare, il Java Language Specification richiede che espressioni costanti essere valutate in fase di compilazione.
Si, sarà semplificato come richiesto dalla i JLS (grazie a @EJP per questa precisione).
Se volete più risorse e l'ottimizzazione javac si dovrebbe dare un'occhiata a ottimizzazioni del compilatore o Java compilatori .
Un'altra cosa interessante è che, anche se il codice è ottimizzato durante la compilazione, un secondo di ottimizzazione sarà fatto durante il runtime con hotspot .
Risorse:
Sullo stesso argomento: