ホームページ >バックエンド開発 >PHPチュートリアル >オペコードキャッシュとJITの違いは何ですか

オペコードキャッシュとJITの違いは何ですか

little bottle
little bottle転載
2019-04-26 16:30:402486ブラウズ

この記事では主にオペコード キャッシュと JIT の違いについて説明します。これには一定の学習価値があります。興味のある友人はそれについて学ぶことができます。お役に立てれば幸いです。

オペコード キャッシュと JIT の違いを説明するには、まず バイトコード (中間コードとも呼ばれる) とマシン コード の違いを理解する必要があります。

オペレーションコード (opcode)

機械命令。たとえば、アセンブリ言語で記述された操作ステートメントなどです。

マシンコード

マシン言語命令の学名。ネイティブ コードとも呼ばれる は、コンピュータの CPU によって直接解釈できるデータです。

マシンコードは、コンピュータの CPU が直接読み取って実行する機械命令です。最も高速に実行されますが、非常に難解で、理解するのが難しく、記述するのが難しく、一般の実務者にはアクセスできません。

そして、マシンコードはクロスプラットフォームをサポートしていません。簡単に言うと、CPU ごとに使用されるマシンコードが異なります。

Bytecode (バイトコード)

は、実行可能プログラムを含む バイナリ ファイルで、一連の操作コード/データのペアで構成されます。バイトコードは中間コードの一種であり、マシンコードよりも抽象的であり、マシンコードの中間コードになる前にインタプリタによって変換される必要があります。

バイトコードは主に、ハードウェア環境に関係なく、特定のソフトウェア操作とソフトウェア環境を実装するために使用されます。バイトコードの実装方法は、コンパイラーと仮想マシンを介して行われます。コンパイラはソース コードをバイトコードにコンパイルし、特定のプラットフォーム上の仮想マシンはそのバイトコードを直接実行できる命令に変換します。バイトコードの典型的なアプリケーションは Java バイトコードであり、PHP は一連のオペコードで構成されるバイナリ ファイルです。

バイトコードは実行時に仮想マシン (JAVA の JVM、PHP の Zend 仮想マシン) を介して変換され、マシン命令が生成されるため、プラットフォーム間でより適切に実行できます。

バイトコードは、中間状態のバイナリコード(ファイル)(中間コード)です。それをマシンコードに変換するにはインタプリタが必要です。

導入部分を通して、CPU はマシン コードのみを実行できることがわかりますが、ハードウェア プラットフォーム全体でアプリケーションを実現するために、さまざまなプログラミング言語用の仮想マシンを実装し、この仮想マシンがコードを変換します。バイナリ コード (ファイル) にコンパイルされます。このバイナリ コードはバイトコードと呼ばれ、中間コードとも呼ばれます。 Zend 仮想マシンによってコンパイルされたバイトコードは、オペコードと呼ばれます (実際には一連のオペコード)。

次に、オペコード キャッシュと JIT について紹介します。

JIT

現在、PHP は JIT テクノロジーを導入していませんが、ニアオ兄弟は、PHP の次のメジャー バージョンでは新しい JIT 機能が導入される可能性があると述べました。待って見てみましょう!ただし、JIT は JAVA エコシステムの中で非常に成熟したテクノロジーなので、JAVA の JIT について話しましょう。

JIT は just in time の略で、

Just-in-time Compilation Compiler です。ジャストインタイム コンパイラ テクノロジを使用すると、Java プログラムの実行を高速化できます。

通常、javac はプログラムのソース コードをコンパイルして Java バイトコードに変換するために使用されます。JVM はバイトコードを対応する機械命令 (マシンコード) に変換し、それを 1 つずつ読み込み、翻訳を 1 つずつ解釈します。 1つ。明らかに、解釈および実行後の実行速度は、実行可能なバイナリ バイトコード プログラムよりも必然的に大幅に遅くなります。実行速度を向上させるために、JIT テクノロジーが導入されています。

JIT は、次回使用するために変換されたマシン コードを保存します (LRU に似たアルゴリズムが必要です)。 JIT が行うべきことは非常に単純であることがわかります。中間コードから変換されたマシンコードを一時的に保存し (どのくらいの期間、どのように選択するかはここでは紹介しません)、そのマシンコードが再度使用されるときに使用できるようにすることです。 、翻訳が 1 つ少なくなります。

オペコード キャッシュ

名前を聞いただけで、中間コード (一連のオペコードで構成されるバイナリ ファイル) をキャッシュすることがわかります。公式 Web サイトから引用すると、OPcache は改善します。プリコンパイルされたスクリプトのバイトコードを共有メモリに保存することで、PHP のパフォーマンスを向上させます。これにより、PHP がリクエストごとにスクリプトをロードして解析する必要がなくなります。

オペコード キャッシュが必要な理由を教えてください。

ライフ サイクルPHP コードの

From PHP パーサーは PHP スクリプトを実行し、スクリプトの内容を出力します。主に 5 つのステップを経ます: Zend エンジンがファイルを読み取り、字句解析、構文解析、意味解析を行い、中間コードを作成し、次に示すように、中間コードを実行します

PHP スクリプトが要求されるたびに、上記の手順が実行されます。

PHP コードが変更されない場合、オペコードも変更されません。. 明らかに、毎回オペコードを生成する必要はないため、コンパイルされたオペコードをキャッシュできます。将来的には、キャッシュに直接アクセスできるようになります。

オペコード キャッシュを有効にした後のフローチャートは次のとおりです。

概要

簡単な説明: JAVA の JIT は CPU によって実行されるマシン コードをキャッシュするために使用され、オペコード キャッシュは Zend 仮想マシン コードをキャッシュするために使用されます。マシンの中間コード。

関連チュートリアル: PHP ビデオ チュートリアル

以上がオペコードキャッシュとJITの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。