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 に答える