Ho deciso di verificare la perspicacia di Java Compiler; quindi, ho scritto una classe semplice.Strana ottimizzazione delle condizioni "if" in Java
public class Foo {
public Foo(boolean a, int b) {
if (a == true && a != false) {
b = 1;
}
}
}
mi chiedevo se il compilatore di ottimizzare la condizione per qualcosa di più semplice come:
if (a == true) {}
ho compilato la classe e poi smontato con lo strumento javap
. Quando ho dato un'occhiata all'output, ero davvero sbalordito, perché il compilatore verifica entrambe le condizioni, ciò che è chiaramente mostrato di seguito.
Compiled from "Foo.java"
public class Foo {
public Foo(boolean, int);
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: iload_1
5: iconst_1
6: if_icmpne 15
9: iload_1
10: ifeq 15
13: iconst_1
14: istore_2
15: return
}
Sono solo curioso, perché è l'esecuzione di istruzioni ridondanti, quando può essere ottimizzato per qualcosa di più semplice?
Non deve essere un caso di uso comune. I compilatori hanno lo scopo di prevedere e prevenire la compilazione di cose che non hanno senso. – itachi
@itachi Non proprio. Ci sono molti modi stupidi per scrivere codice, e scrivere ottimizzazioni per tutti loro renderebbe il compilatore difficile da mantenere e incline agli stessi bug. – RealSkeptic
Dopo aver completamente annullato Minecraft, posso tranquillamente dire che Java esegue ottimizzazioni semantiche molto piccole, se non nessuna. – Qix