淺述PHP7底層設計01-PHP7語言執行原理

2020-07-16 10:06:15
PHP作為一種直譯語言,不同於編譯型語言編譯結果即為當前CPU體系的指令,PHP原始碼只有編譯成opcode才能夠被zend虛擬機器直接執行。

下面就簡單描述PHP7語言執行原理:

1. 原始碼首先利用Re2c實現的詞法分析器進行詞法分析,將原始碼切割為多個字串單元,分割後的字串稱為Token;

2. 基於Bison實現的語法分析器將Token和符合BNF文法規則的程式碼生成抽象語法樹;

3. 抽象語法樹(AST)編譯生成opcode;

1588061848833-92196909-e169-4cef-b3fc-4487c86ebad0.jpeg

我們常常討論的直譯語言執行效率較低,原因在於PHP執行過程中要多了翻譯為opcode的過程。

不僅如此,與常駐記憶體的Java等語言不同,PHP程式碼在執行過後,記憶體會馬上釋放,基本上所有資料都會在此時銷毀(僅有極少數資料會快取)。

這種執行機制的優點在於有效避免記憶體漏失,記憶體回收機制更簡單,缺點就是每個PHP請求都得重複執行請求-翻譯-執行的過程。

備註:記憶體漏失(Memory Leak)是指程式中己動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。

為了彌補不是常駐記憶體的缺憾,引入opcode快取,zend虛擬機器會將第一次執行的PHP程式碼編譯結果快取到記憶體或者硬碟中,當下次執行該部分程式碼時直接讀取快取,一定程度上可以提高PHP執行速度。

參考資料

1. 陳雷,PHP7底層設計與原始碼實現

2. 列旭松,陳文,PHP核心技術與最佳實踐

以上就是淺述PHP7底層設計01-PHP7語言執行原理的詳細內容,更多請關注TW511.COM其它相關文章!