Java でおもちゃのインタープリターをいじっています。Java 仮想マシン用のバイトコードを生成できる単純なコンパイラーを作成しようと考えていました。JVM や CLI などの仮想マシンを対象とするコンパイラは、どの程度の最適化を行う必要があるのでしょうか。
ジャスト イン タイム (JIT) コンパイラは、定数の折りたたみ、ピープホールの最適化などを行いますか?
Java でおもちゃのインタープリターをいじっています。Java 仮想マシン用のバイトコードを生成できる単純なコンパイラーを作成しようと考えていました。JVM や CLI などの仮想マシンを対象とするコンパイラは、どの程度の最適化を行う必要があるのでしょうか。
ジャスト イン タイム (JIT) コンパイラは、定数の折りたたみ、ピープホールの最適化などを行いますか?
Java のバイトコードと、実行時の JVMのさまざまな最適化について説明する 2 つのリンクを追加します。
最適化は、JVM を長期実行アプリケーションの環境として実行可能にするものです。SUN、IBM、およびその友人が、バイトコードと JIT コンパイルされたコードを可能な限り効率的な方法で最適化できるように最善を尽くしていることは間違いありません。
そうは言っても、バイトコードを事前に最適化できると思われる場合は、おそらくそれほど害はありません。
ただし、JVM は、Java コンパイラーが作成する傾向があるバイトコードのようなものを提示すると、パフォーマンスが向上する (クラッシュしない) 傾向があることに注意してください。javac によって生成されるものとは異なり、正しいバイトコードの順列が発生した場合、最適化が見逃されたり、JVM がクラッシュしたりすることはよく知られています。うまくいけば、そのようなことは今では過去のものになっていますが、注意する必要があるかもしれません.
ほとんどの場合、バイトコードの最適化はおそらく矛盾した表現です
そうは思いません。ループ不変条件の巻き上げや定数の伝播などの最適化は、JVM がそれ自体で行うのに十分なほどスマートであっても、コードの作業を少なくするという単純な利点によって害を及ぼすことはありません。
ProGuard などの難読化ツールは、バイトコードに対して多くの静的最適化を実行します。
HotSpot コンパイラは、コンパイル時よりも実行時にコードを最適化します。結局のところ、より多くの情報を扱うことができます。アルゴリズムだけでなくバイトコードを最適化する必要があるのは、Blackberry などのモバイル デバイスをターゲットにしている場合のみです。この場合、そのプラットフォームの JVM は実行時にコードを最適化するほど強力ではなく、バイトコードを実行するだけです。
ほとんどの場合、バイトコードの最適化はおそらく矛盾した表現です。VM を制御しない限り、コードの実行を高速化するために VM が何をするかはわかりません。コンパイラは、最適化されたコードを生成するために VM の詳細を知る必要があります。
アセラフィムへのメモ:
いくつかの限られたケースでは、非組み込みアプリケーションのバイトコードを最適化することも役立ちます。
WebStart アプリなどのネットワーク経由でコードを配信する場合は、配信物/キャッシュ サイズを最小限に抑え、クライアントの機能/速度を必ずしも把握していないためです。
パフォーマンスが重要であり、HotSpot が統計を収集する前に (たとえば) 起動時に使用されることがわかっているコードの場合。
繰り返しになりますが、優れたオプティマイザー/難読化ツールが実行する変換は非常に役立ちます。