为什么javac不优化甚至简单的代码?

Mar*_*cin 8 java optimization javac

给出以下代码:

public class MainClass {
    public static int f(){
        int i=0;
        i++;
        return i;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器javac生成以下代码:

Compiled from "MainClass.java"
public class latte_jvm.MainClass {

  public static int f();
    Code:
       0: iconst_0
       1: istore_0
       2: iinc          0, 1
       5: iload_0
       6: ireturn
}
Run Code Online (Sandbox Code Playgroud)

函数f确实很简单 - 它只返回1.它是如此直接翻译,以至于我很难相信java编译器会进行任何优化.为什么java编译器创建者决定不在编译阶段进行这样的优化?

Jon*_*eet 17

如此直接翻译使我很难相信java编译器会进行任何优化.

确实.大多数Java优化都是在JIT时执行的.Java维护者很久以前就发现,在很多情况下,在编译时执行的优化实际上阻​​碍了JIT时间更重要的优化.

几年来,-O命令行论证没有做任何事情 - 而且非常刻意.

  • @Marcin它可以,但这需要努力,而JIT已经做到了. (2认同)
  • +1恕我直言,'javac`所做的一些优化可以成为祝福的诅咒.例如,内联编译时常量. (2认同)
  • @jstephenson:Hotspot逐步优化 - 它可能会在第一次执行方法时选择不进行JIT(适用于仅执行一次的启动代码),但随后会逐步应用"更难"的优化.它也可以做出假设,例如"没有人会覆盖这种方法,所以它可以被内联"然后*如果必要的话,如果这些假设稍后会被*优化.精彩而坦率地恐怖. (2认同)

irr*_*ble 6

此外,通过将优化移至JVM,所有基于JVM的语言都可以从中受益.编译器(不仅仅是javac)有一个相对容易的工作; 语言发明者不必是优化专家.