PHPはコンパイルまたは解釈されますか?


142

PHPはコンパイルまたは解釈されますか?

回答:


127

PHPはインタプリタ言語です。PHPの解釈を可能にするバイナリはコンパイルされていますが、記述した内容は解釈されます。

詳細については、ウィキペディアの解釈言語のページをご覧ください。


26
彼は、php(またはWindowsではphp.exe)というユーティリティがコンパイルされていることを意味します。
sepp2k 2009年

7
@nickyこれは、PHPの解釈に使用されるプログラムはコンパイルされているが、PHP自体は解釈されることを意味します。
アンドリュー・ソング

5
しかし、なぜウィキペディアでこのように言及されているのでしょうか?goo.gl/YOwZ PHP 4以降、PHPパーサーは入力をコンパイルしてZend Engineで処理するためのバイトコードを生成し、以前のインタープリターよりもパフォーマンスが向上しています。
kiranvj

5
@kiranvjパフォーマンス向上のためにコンパイルされていますが、実行時です。「コンパイル済み言語」を「プリコンパイル済み」と解釈し、インタープリター言語を「実行時にコンパイル済み」と考えてください。これは、これら2つの違いです。-JIT( "ジャストインタイム")。必要なときに必要なコードのみがコンパイルされます(ただし、インタープリターが終了した後、コンパイルされたコードは大量になることに注意してください)-AOT( " 事前に」)、実行前にすべてのコードがコンパイルされます。
Thibault Martin-Lagardette、2012年

4
@kiranvj:PHPがネイティブコードにコンパイルされるかどうかOPが知りたかったと思います。これをバイトコードにコンパイルすると、Zendによって再度解釈されますが、コンパイルのコストと実行時のパフォーマンスの点で中間にあります。笑、これはかなり古いスレッドです。
Groo

66

両方とも。PHPは中間バイトコードにコンパイルされ、ランタイムエンジンによって解釈されます。

PHPコンパイラの仕事は、PHPコードを解析して、ランタイムエンジンに適した形式に変換することです。そのタスクの中で:

  • コメントを無視する
  • 変数、関数名などを解決し、シンボルテーブルを作成する
  • プログラムの抽象構文ツリーを構築する
  • バイトコードを書き込む

PHPの設定に応じて、この手順は通常、スクリプトが初めて呼び出されたときに1回だけ実行されます。コンパイラの出力はキャッシュされ、以降の使用でのアクセスを高速化します。ただし、スクリプトが変更された場合は、コンパイル手順が再度実行されます。

スクリプトが呼び出されると、ランタイムエンジンはASTとバイトコードを調べます。シンボルテーブルは、変数の値を格納し、関数のバイトコードアドレスを提供するために使用されます。

実行時にバイトコードにコンパイルしてそれを解釈するこのプロセスは、Perl、Java、Ruby、Smalltalkなどの仮想ランタイムマシン上で実行される言語では一般的です。


変数バインディングは、コンパイル時ではなく実行時に発生します。
jrockway 2009年

PHPは、コンパイル時にスコープ内にある名前を解決しようとしないのですか?
バリーブラウン、

17

一般的には解釈されますが、コンパイルされた状態で使用でき、実際にパフォーマンスが向上します。この操作を実行するオープンソースツール:hhvm.com


15

PHPはインタプリタ言語です。ただし、サードパーティのツールを使用してバイトコードにコンパイルできます。


2
「バイトコード」はVM固有の疑似命令に使用される用語であり、ネイティブではないため、このコンテキストでは「コンパイル」と見なすことはできません。
セダットカパノグル2009年

7
「オブジェクトコード」は、CPUの命令デコーダの単なるバイトコードです。(CPUが実際に「CMPSB」のようなネイティブ命令を持っているとは思わないでしょうか?)
jrockway

11

コンパイルされたコードは、コンピュータのCPUによって直接実行することができます。つまり、実行可能コードはCPUの母国語で指定されています

インタープリター型言語のコードは、実行時に任意の形式からCPUマシン命令に変換する必要があります。この翻訳は通訳によって行われます。

解釈とコンパイルは両方ともその特定の言語の実装プロパティであり、言語自体のプロパティではないため、言語が解釈またはコンパイルされると言うのは適切ではありません。したがって、任意の言語をコンパイルまたは解釈できます。それは、使用している特定の実装が何をするかに依存します。

最も広く使用されているPHP実装は、Zend Engineを搭載しており、単にPHPとして知られています。ZendEngineは、PHPソースをコンパイルして実行可能な形式にするため、Zendエンジンインタープリターとして機能します。


2
" つまり、実行可能コードはCPUのネイティブ言語で指定されています " ..実行可能コードはCPUのネイティブ言語では指定されていませんが、バイナリ形式では、CPUのネイティブ言語は何でも可能であり、ソフトウェアバイナリがこのようにならない場合CPUまたはそのCPU ..完全にコンパイルされて実行可能なコードはバイナリ形式になります..
hagrawal

10

これは無意味な質問です。PHPは、GCCと同様にyacc(バイソン)を使用します。yaccは「コンパイラコンパイラ」です。yaccの出力はコンパイラーです。コンパイラーの出力は「コンパイル済み」です。PHPはyaccの出力によって解析されます。したがって、定義により、コンパイルされます。

それでも満足できない場合は、以下を検討してください。php(バイナリ)とgccの両方がソースコードを読み取り、抽象構文ツリーを生成します。バージョン4および5では、phpはツリーをたどってプログラムをバイトコードに変換します(コンパイル手順)。Vulcan Logic Dumperを使用して、バイトコードがオペコード(アセンブリーに類似)に変換されたことがわかります。最後に、php(特にZendエンジン)がバイトコードを解釈します。一方、gccはツリーをウォークして、アセンブリを出力します。また、アセンブラとリンカを実行してプロセスを完了することもできます。一方の「解釈済み」で処理されるプログラムと、もう一方の「コンパイル済み」で処理される別のプログラムを呼び出しても意味がありません。結局のところ、プログラムはどちらも「コンパイラ」を介して実行されます。

代わりに、聞きたい質問を実際に尋ねるべきです。(「PHPはすべてのリクエストに対してソースコードを再コンパイルするので、パフォーマンスペナルティを支払いますか?」など)


5
ソースコードのトークン化はコンパイルされません。VBScriptでさえ、ユーザー定義のコンパイル言語と見なすことができます。
Sedat Kapanoglu、2009年

5
私はこれについてjrockwayを使っていますが、OPの質問には実際には答えません。すべての言語が各カテゴリにきれいに配置される言語の分類法を作成するのは魅力的です。しかし、現実はそれほどきれいではありません。ほとんどすべての言語は、特性のブレンドです。さらに、それに慣れると、ネイティブマシンコードでさえプロセッサーによって「解釈」されます。
バリーブラウン

4
あなたの高レベルの主張は正しいです、これ無意味な質問です。しかし、あなたの主張はあまり役に立ちません。あなたがしたことはすべて、あいまいな定義を取り、それらを極端に解釈することです。コンパイルとは、ソースをオブジェクトコードに変換することです。はい、ソースの具象/抽象構文ツリーへの変換をコンパイルと見なすことができますが、それはほとんどの人がそれを意味しているのではありませんか?とにかく、言語は本質的にコンパイルまたは解釈されないため、これは意味のない質問です。言語の実装はコンパイルまたは解釈されます。
Falaina、2009年

6
男が初心者であることを監督しないでください。これにより、「Zendの実装はPHPソースからネイティブコードを生成するのですか」という質問を解釈します。私の答えをチェックしてください。質問の仕方が厳しすぎると思います。ご存知のように、私たちは、初心者を打ちのめすのではなく、支援しようとしています。
セダットカパノグル2009年

3
私はセダに完全に同意します。あなたは知識人に
熱中

10

私はこの質問が古いことを知っていますが、それはいたるところにリンクされており、ここでのすべての回答は正しくないと思います(おそらく古いためです)。

インタプリタ言語やコンパイル言語などはありません。任意のプログラミング言語を解釈および/またはコンパイルできます。

まず第一に、言語は単なるルールのセットであるため、コンパイルについて話すときは、その言語の特定の実装を参照します。

たとえば、HHVMはPHPの実装です。JITコンパイルを使用して、コードを中間HipHopバイトコードに変換し、マシンコードに変換します。コンパイルされていると言えば十分ですか?一部のJava実装(すべてではない)もJITを使用します。GoogleのV8もJITを使用しています。

コンパイル済みと解釈済みの古い定義を使用することは、今日では意味がありません。

「PHPはコンパイルされていますか?」コンパイルされた言語と解釈された言語の間に明確で合意された区切り文字がないため、非合理的な質問です。

それらを区切る1つの可能な方法は次のとおりです(この二分法には意味がありません)。

コンパイルされた言語は、Ahead of Timeコンパイル(C、C ++)を使用します。

インタプリタ言語はジャストインタイムコンパイルを使用するか、まったくコンパイルしない(Python、Ruby、PHP、Java)。


ただし、ほとんどの場合、Javaは事前コンパイルを使用しませんか?私はかなり新しいJava開発者であり、通常、実行前にコードをコンパイルします。
aCarella 2017年

@aCarella in most cases、はい。すべての場合において、いいえ。したがって、意味的に重要で合意された線を引くことはできません。
Claudiu Creanga 2017年

2

少なくとも、コードは必要なだけコンパイルされません(または最適化と言うべきでしょう)。

このコード...

for($i=0;$i<100000000;$i++);
echo $i;

...実行されるたびにプログラムを均等に遅延させます。

初めて実行する必要があるのは計算であることが検出された可能性があります。


これでジェネレーターというオプションがあります。
Ankit Vishwakarma 2016

1

受け入れられた答えは明らかに虚偽です。PHPはコンパイルされています。物語の終わり。たぶん、ネイティブ命令ではなく、解釈されたバイトコードに。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.