2013-08-20 66 views
0

我總是在技術文章中看到parsecompile。所以我想知道PHP的工作原理。我發現PHP是Interpreted語言,未編譯。我在網上搜索了關於parse,Interpretcompile,但在整個過程中仍然不明確。下面是一個例子PHP代碼:php:關於解析和解釋過程

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

輸出:

Hello world! What a nice day! 

任何人都可以從源代碼的整個過程(解析,解釋...)解釋到輸出?該方法的感謝

回答

4

非常高的水平,而不一定完整的綜述:

  1. 的源代碼是記號化,即,它被分解成單獨的部件,並且這些部件被「劃分」。 $str1是一個變量,=是一個操作符,"Hello world!"是文字串,;是一個語句結束等
  2. 令牌被變換成一個abstract syntax tree,即令牌「由分組的含義」。像的東西,我們有一個表達=賦值運算符第一個操作數$str1,其第二個操作數是字符串文字"Hello world!"

    這兩個步驟完成解析

  3. 語法樹中的各個部分被翻譯成低級機器指令,例如, 預留一些內存來存儲「Hello world!」並創建一個符號$str1來引用它

    這個描述對於「機器指令」還是非常高的水平,我只是在這裏用它來保持簡單。

    這基本上是彙編的一步。

  4. 該指令被執行。

「解釋」語言和「編譯」語言之間的區別有些隨意。任何語言都需要被解析然後翻譯成機器指令,這基本上是彙編。 「真正的」編譯語言必須首先編譯爲二進制可執行文件,然後手動執行。 PHP基本上一舉兩得,但隨後拋出可執行代碼。這基本上是解釋爲的代碼;它從源頭上進行解析和編譯。有用於PHP的字節碼緩存,用於緩存機器碼,不需要PHP一遍又一遍地重新編譯相同的代碼。「真正的」編譯器也可以用於其他目的:它們通常可以在編譯過程中通過分析代碼來檢測基本甚至非常複雜的問題,然後拒絕編譯它;由於PHP在進行編譯時不會遇到這些問題,並且在代碼已經執行時會出現問題,這需要與編譯語言不同的錯誤處理原理。 「真正的」編譯器也可以花更多時間優化代碼並可能使其更快執行;因爲PHP在飛行中執行它,所以如果任何時候優化代碼,它都不會花太多時間,因爲這會讓它變得更慢。

順便說一句,PHP作爲語言既不解釋也不編譯。這只是一種語言。 標準的官方PHP運行時環境是解釋語言的東西。也有PHP編譯器,最着名的是Facebook的HipHop,它將PHP代碼編譯爲可執行的二進制文件。