首頁  >  文章  >  後端開發  >  了解PHP 8的JIT

了解PHP 8的JIT

coldplay.xixi
coldplay.xixi轉載
2020-08-19 17:14:253870瀏覽

了解PHP 8的JIT

【相關推薦:了解PHP 8的JIT8

了解PHP 8的JIT

TL;DR

了解PHP 8的JIT 8 的JIT(Just In Time)編譯器將作為擴充整合到php 中 Opcache 擴充 用於執行時間將某些操作碼直接轉換為從cpu 指令。

這表示使用JIT後,Zend VM 不需要解釋某些操作碼,而這些指令將直接作為CPU級指令執行。

了解PHP 8的JIT 8 的 JIT

了解PHP 8的JIT 8 Just In Time(JIT)編譯器帶來的影響是毋庸置疑的。但到目前為止,我發現關於 JIT 應該做什麼卻知之甚少。

經過多次研究和放棄,我決定親自檢查了解PHP 8的JIT原始碼。結合我對C語言的一些知識和我目前收集到的所有零散信息,我提出了這篇文章,我希望它能幫助您更好地理解了解PHP 8的JIT的JIT。

簡單一點來說 : 當JIT如預期運作時,您的程式碼不會透過Zend VM執行,而是作為一組CPU級指令直接執行。

這就是全部的想法。

但為了更好地理解它,我們需要考慮php如何在內部運作。不是很複雜,但需要一些介紹。

我寫了一篇部落格文章,大致概述了php的工作原理。如果你覺得這篇文章寫太多了,就去查另一篇,稍後再來。事情會變得更容易理解。

了解PHP 8的JIT的程式碼是怎麼執行的?

總所周知, 了解PHP 8的JIT 是解釋型語言,但這句話本身是什麼意思呢?

每次執行 了解PHP 8的JIT 程式碼(命令列腳本或 WEB 應用程式)時,都要經過 了解PHP 8的JIT 解譯器。最常用的是 了解PHP 8的JIT-FPM 和 CLI 解譯器。

解釋器的工作很簡單:接收 了解PHP 8的JIT 程式碼,對其進行解釋,然後傳回結果。

一般的解釋型語言都是這個流程。有些語言可能會減少幾個步驟,但總體的思路相同。在 了解PHP 8的JIT 中,這個流程如下:

  1. 讀取 了解PHP 8的JIT 程式碼並將其解釋為一組稱為 Tokens 的關鍵字。這個過程讓解釋器知道各個程式都寫了哪些程式碼。 這一步稱為 Lexing 或 Tokenizing 。

  2. 拿到 Tokens 集合以後,了解PHP 8的JIT解譯器會試著解析他們。透過稱為 Parsing 的過程產生抽象語法樹(AST)。這裡 AST 是一個節點集表示要執行哪些動作。例如,「 echo 1 1 」實際意義是 「印 1 1 的結果」 或者更詳細的說 「印出一個動作,這個動作是 1 1」。

  3. 有了 AST ,可以更輕鬆地理解操作和優先順序。將抽象語法樹轉換成可以被 CPU 執行的操作需要一個用於過渡的表達式(IR),在 了解PHP 8的JIT 中我們稱為 Opcodes 。將 AST 轉換為 Opcodes 的過程稱為 compilation

  4. 有了 Opcodes ,有趣的部分就來了: executing 程式碼! 了解PHP 8的JIT 有一個稱為 Zend VM 的引擎,該引擎能夠接​​收一系列 Opcodes 並執行它們。執行所有 Opcodes 後, Zend VM 就會將程式終止。

這個圖可以讓你更清楚:

了解PHP 8的JIT 的解释流程.

#一個簡化版的 了解PHP 8的JIT 解釋流程概述。

如你所見。這裡有個問題:即使 了解PHP 8的JIT 程式碼沒改變,每次執行還是會走此流程嗎?

讓我們看回 Opcodes 。對了!這就是 Opcache 擴充 存在的原因。

Opcache 擴充功能

Opcache 擴充是 了解PHP 8的JIT 附帶的,通常沒必要停用它。使用 了解PHP 8的JIT 最好開啟 Opcache 。

它的作用是為 Opcodes 增加一個記憶體共享快取層。它的工作是從 AST 中提取新生成的 Opcodes 並快取它們,以便執行時可以跳過 Lexing/Tokenizing 和 Parsing 步驟。

這是包含 Opcache 擴充功能的流程示意圖:

使用 Opcache 的 了解PHP 8的JIT 解释流程

了解PHP 8的JIT 使用 Opcache 的解釋流程。如果檔案已經被解析,則 了解PHP 8的JIT 會為其取得快取的 Opcodes ,而不是再次解析。

完美的跳過了Lexing/Tokenizing 、 Parsing 和Compiling 步驟

相關學習推薦:php程式設計(影片)

#

以上是了解PHP 8的JIT的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除