第4章 JITコンパイラー JITコンパイラーを使う
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
ジャスト・イン・タイム(JIT)コンパイラーはJava仮想マシンの心臓部であり、JITコンパイラーほどアプリケーションのパフォーマンスを左右するものはない。
この章では、コンパイラについて詳しく説明する。コンパイラがどのように動作するかという情報から始まり、JITコンパイラを使う利点と欠点について議論する。 JDK 8が登場するまでは、2つのJavaコンパイラのどちらかを選ばなければならなかった。今日、この2つのコンパイラはまだ存在しているが、互いに協調して動作している。 最後に、コンパイラの中級および上級チューニングについて見ていく。明らかな理由もなくアプリケーションの動作が遅い場合、これらのセクションはコンパイラに問題があるかどうかを判断するのに役立つだろう。
ジャストインタイム・コンパイラ:概要
ジャストインタイム・コンパイルの基本を理解していれば、読み飛ばしても構わない。
コンピューター、より具体的にはCPUは、マシンコードと呼ばれる比較的少数の特定の命令しか実行できない。したがって、CPUが実行するすべてのプログラミングは、これらの命令に翻訳されなければならない。
C++やFortranのような言語がコンパイル言語と呼ばれるのは、そのプログラミング言語がバイナリ(コンパイル)コードとして呼び出されるからである。そのバイナリに含まれるアセンブリコードは、特定のCPUをターゲットにしている。 相補的なCPUは、同じバイナリを実行することができる。たとえば、AMDとインテルのCPUは、基本的な共通のアセンブリ言語命令セットを共有しており、それ以降のバージョンのCPUは、ほとんどの場合、そのCPUの以前のバージョンと同じ命令セットを実行することができる。逆に、旧バージョンのCPUでは実行できない命令が、新バージョンのCPUに導入されることもある。
一方、PHPやPerlのような言語はインタプリタである。 正しいインタプリタ(つまり、php またはperl と呼ばれるプログラム)を持つマシンであれば、同じプログラムのソースコードをどのCPUでも実行することができる。 インタプリタは、プログラムの各行をバイナリコードに変換しながら実行する。
それぞれのシステムには利点と欠点がある。 インタプリタ言語で書かれたプログラミングは移植性が高い。同じコードを、適切なインタプリタがあるマシンにドロップすれば実行できる。しかし、動作は遅いかもしれない。単純な例として、ループの中で何が起こるかを考えてみよう。ループの中でコードが実行されると、インタプリタはそれぞれの行を再翻訳する。コンパイルされたコードは、その翻訳を繰り返す必要はない。
優れたコンパイラーは、バイナリをプロデューサするときにいくつかの要素を考慮する。単純な例としては、バイナリ文の順番がある。すべてのアセンブリ言語命令が同じ時間をかけて実行されるわけではない。つのレジスタに格納された値を加算する文は1サイクルで実行されるかもしれないが、加算に必要な値を(メインメモリから)取り出すには複数サイクルかかるかもしれない。
したがって、優れたコンパイラは、データをロードする文を実行し、他の命令を実行し、データが利用可能になったら加算を実行するバイナリをプロデューサが作成する。一度に1行のコードしか見ていないインタプリタは、そのようなコードを生成するのに十分な情報を持っていない。ところで、悪いコンパイラーも同じことをする。どんなに優れたコンパイラーでも、命令が完了するのを待つことがあるのを防げるとは限らない。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access