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

给出以下代码:

public class MainClass { public static int f(){ int i=0; i++; return i; } } 

编译器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 } 

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

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

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

几年来, -O命令行参数没有做任何事情 – 而且非常刻意。

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