Сегодня я преподавал вводный курс программирования и проходил через простой код с назначением переменных в Java. Точка кода заключалась не в том, чтобы показать что-то особенное, но в основном для того, чтобы ученики поняли переменные присваивания.
У меня был следующий метод на доске и он прослеживал через него по одной строке за раз:
private void simpleMethod() {
int myInt = 137;
myInt = 42;
myInt = myInt + 1;
/* ... code using myInt ... */
}
Студент спросил меня, будет ли myInt
когда-либо иметь значения 137 и 42, когда программа запустится, или если он просто прыгнет прямо в холдинг 43. Я сказал ученику, что код будет выполнять каждую строку поочередно, поэтому переменная будет фактически удерживать эти промежуточные значения.
Честно говоря, я не был уверен, что будет вызываться байт-код javac
(полностью игнорируя оптимизацию, выполняемую JVM). Является ли javac
(или любой Java-компилятор) законным образом разрешать оптимизацию глупых операторов присваивания и вместо этого просто непосредственно инициализировать myInt
до 43?
Согласно javap
, в моей системе приведенный выше код javac
генерирует
0: sipush 137
3: istore_1
4: bipush 42
6: istore_1
7: iload_1
8: iconst_1
9: iadd
10: istore_1
11: return
Итак, здесь нет оптимизации. Мой вопрос, однако, в том, является ли законным оптимизировать это или нет, поэтому это ничего не решает.