0

私はいつも 技術記事でparseorを見ます。compileだから私はPHPがどのように機能するか知りたいです。PHPはコンパイルされた言語ではなく、解釈された言語であることがわかりました。parseInterpretおよびについてオンラインでグーグル検索しましcompileたが、プロセス全体についてはまだ明確ではありません。以下は PHP コードの例です。

<?php
$str1="Hello world!";
$str2="What a nice day!";
echo $str1 . " " . $str2;
?>  

出力:

Hello world! What a nice day! 

ソースコードから出力までのプロセス全体(解析、解釈...)を説明できる人はいますか? ありがとう

4

1 に答える 1

6

プロセスの非常に高レベルであり、必ずしも完全な概要ではありません。

  1. ソース コードはトークン化されます。つまり、ソース コードは個々のパーツに分解され、これらのパーツは「分類」されます。$str1変数、=演算子、"Hello world!"文字列リテラル、;ステートメントターミネータなどです。
  2. トークンは抽象構文ツリーに変換されます。つまり、トークンは「意味によってグループ化」されます。最初のオペランドで、2 番目のオペランドが文字列リテラルである代入演算子使用しがあるようなものです。= $str1"Hello world!"

    この 2 つの手順で解析が完了します。

  3. 構文ツリーの個々の部分は、低レベルのマシン命令に変換されます。たとえば、"Hello world!" を格納するためにメモリを予約します。$str1それを参照するシンボルを作成します

    ところで、その説明はまだ「マシン命令」のかなり高レベルであり、ここでは単純にするために使用しています。

    これは基本的にコンパイル手順です。

  4. 命令が実行されます。

「解釈された」言語と「コンパイルされた」言語の違いは、いくぶん恣意的です。どの言語も、解析して機械語命令に変換する必要があります。これは基本的にコンパイルです。「実際の」コンパイル済み言語は、最初にバイナリ実行可能ファイルにコンパイルする必要があり、それを手動で実行します。PHP は基本的に両方を一度に実行しますが、実行可能コードは破棄します。それが本質的に解釈されたコードです。ソースからオンザフライで解析およびコンパイルされます。マシン コードをキャッシュする PHP 用のバイト コード キャッシュがあり、PHP が同じコードを何度も再コンパイルする必要はありません。

「本物の」コンパイラは、他の目的にも役立ちます。コードを分析することで、コンパイル中に基本的な問題や非常に複雑な問題を検出し、コンパイルを拒否することがよくあります。PHP は進行に合わせて処理を行うため、コンパイル中にこの種の問題を検出することはできず、コードが既に実行されている間に問題が発生します。これには、コンパイル済み言語とは異なる種類のエラー処理の哲学が必要です。「本物の」コンパイラは、コードの最適化により多くの時間を費やすことができ、実行速度を向上させる可能性があります。PHP はオンザフライで実行するため、コードの最適化に多くの時間を費やすことはありません。

ところで、言語としての PHPは解釈もコンパイルもされません。それはただの言語です。標準の公式の PHP ランタイム環境は、言語を解釈しているものです。また、最も有名な Facebook の HipHop で、PHP コードを実行可能なバイナリにコンパイルするPHP コンパイラもあります。

于 2013-08-20T06:56:51.270 に答える