回答:
PHPはインタプリタ言語です。PHPの解釈を可能にするバイナリはコンパイルされていますが、記述した内容は解釈されます。
両方とも。PHPは中間バイトコードにコンパイルされ、ランタイムエンジンによって解釈されます。
PHPコンパイラの仕事は、PHPコードを解析して、ランタイムエンジンに適した形式に変換することです。そのタスクの中で:
PHPの設定に応じて、この手順は通常、スクリプトが初めて呼び出されたときに1回だけ実行されます。コンパイラの出力はキャッシュされ、以降の使用でのアクセスを高速化します。ただし、スクリプトが変更された場合は、コンパイル手順が再度実行されます。
スクリプトが呼び出されると、ランタイムエンジンはASTとバイトコードを調べます。シンボルテーブルは、変数の値を格納し、関数のバイトコードアドレスを提供するために使用されます。
実行時にバイトコードにコンパイルしてそれを解釈するこのプロセスは、Perl、Java、Ruby、Smalltalkなどの仮想ランタイムマシン上で実行される言語では一般的です。
PHPはインタプリタ言語です。ただし、サードパーティのツールを使用してバイトコードにコンパイルできます。
コンパイルされたコードは、コンピュータのCPUによって直接実行することができます。つまり、実行可能コードはCPUの母国語で指定されています
インタープリター型言語のコードは、実行時に任意の形式からCPUマシン命令に変換する必要があります。この翻訳は通訳によって行われます。
解釈とコンパイルは両方ともその特定の言語の実装のプロパティであり、言語自体のプロパティではないため、言語が解釈またはコンパイルされると言うのは適切ではありません。したがって、任意の言語をコンパイルまたは解釈できます。それは、使用している特定の実装が何をするかに依存します。
最も広く使用されているPHP実装は、Zend Engineを搭載しており、単にPHPとして知られています。ZendEngineは、PHPソースをコンパイルして実行可能な形式にするため、Zendエンジンはインタープリターとして機能します。
これは無意味な質問です。PHPは、GCCと同様にyacc(バイソン)を使用します。yaccは「コンパイラコンパイラ」です。yaccの出力はコンパイラーです。コンパイラーの出力は「コンパイル済み」です。PHPはyaccの出力によって解析されます。したがって、定義により、コンパイルされます。
それでも満足できない場合は、以下を検討してください。php(バイナリ)とgccの両方がソースコードを読み取り、抽象構文ツリーを生成します。バージョン4および5では、phpはツリーをたどってプログラムをバイトコードに変換します(コンパイル手順)。Vulcan Logic Dumperを使用して、バイトコードがオペコード(アセンブリーに類似)に変換されたことがわかります。最後に、php(特にZendエンジン)がバイトコードを解釈します。一方、gccはツリーをウォークして、アセンブリを出力します。また、アセンブラとリンカを実行してプロセスを完了することもできます。一方の「解釈済み」で処理されるプログラムと、もう一方の「コンパイル済み」で処理される別のプログラムを呼び出しても意味がありません。結局のところ、プログラムはどちらも「コンパイラ」を介して実行されます。
代わりに、聞きたい質問を実際に尋ねるべきです。(「PHPはすべてのリクエストに対してソースコードを再コンパイルするので、パフォーマンスペナルティを支払いますか?」など)
私はこの質問が古いことを知っていますが、それはいたるところにリンクされており、ここでのすべての回答は正しくないと思います(おそらく古いためです)。
インタプリタ言語やコンパイル言語などはありません。任意のプログラミング言語を解釈および/またはコンパイルできます。
まず第一に、言語は単なるルールのセットであるため、コンパイルについて話すときは、その言語の特定の実装を参照します。
たとえば、HHVMはPHPの実装です。JITコンパイルを使用して、コードを中間HipHopバイトコードに変換し、マシンコードに変換します。コンパイルされていると言えば十分ですか?一部のJava実装(すべてではない)もJITを使用します。GoogleのV8もJITを使用しています。
コンパイル済みと解釈済みの古い定義を使用することは、今日では意味がありません。
「PHPはコンパイルされていますか?」コンパイルされた言語と解釈された言語の間に明確で合意された区切り文字がないため、非合理的な質問です。
それらを区切る1つの可能な方法は次のとおりです(この二分法には意味がありません)。
コンパイルされた言語は、Ahead of Timeコンパイル(C、C ++)を使用します。
インタプリタ言語はジャストインタイムコンパイルを使用するか、まったくコンパイルしない(Python、Ruby、PHP、Java)。
in most cases
、はい。すべての場合において、いいえ。したがって、意味的に重要で合意された線を引くことはできません。
少なくとも、コードは必要なだけコンパイルされません(または最適化と言うべきでしょう)。
このコード...
for($i=0;$i<100000000;$i++);
echo $i;
...実行されるたびにプログラムを均等に遅延させます。
初めて実行する必要があるのは計算であることが検出された可能性があります。