8

给定以下代码:

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 编译器的创建者决定在编译阶段不做这样的优化?

4

2 回答 2

17

翻译得如此直接,以至于我很难相信 java 编译器会进行任何优化。

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

几年来,-O命令行参数什么也没做——而且是故意的。

于 2012-11-28T18:21:23.870 回答
6

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

于 2012-11-28T20:17:29.030 回答