opcode cache與JIT之間有哪些區別

2020-07-16 10:05:31
本篇文章主要講述的是opcode cache與JIT的區別,具有一定學習價值,感興趣的朋友可以了解一下,希望對你能有所幫助。

要說明opcode cache與JIT的區別,得先明白,位元組碼,又叫中間碼與機器碼的區別

操作碼(opcode)

一條機器指令。比如我們組合語言寫的一條操作語句。

機器碼(machine code)

學名機器語言指令,有時也被稱為原生碼(Native Code),是電腦的CPU可直接解讀的資料

機器碼是電腦CPU直接讀取執行的機器指令,執行速度最快,但是非常晦澀難懂,也比較難編寫,一般從業人員接觸不到。

而且機器碼不支援跨平台,簡單點將就是不同的CPU使用的機器碼是不一樣的。

位元組碼(bytecode)

是一種包含執行程式、由一序列 op 程式碼/資料對 組成的二進位制檔案。位元組碼是一種中間碼,它比機器碼更抽象,需要直譯器轉譯後才能成為機器碼的中間程式碼。

位元組碼主要為了實現特定軟體執行和軟體環境、與硬體環境無關。位元組碼的實現方式是通過編譯器和虛擬機器器。編譯器將原始碼編譯成位元組碼,特定平台上的虛擬機器器將位元組碼轉譯為可以直接執行的指令。位元組碼的典型應用為Java bytecode,那PHP的就是一系列opcode組成的二進位制檔案。

位元組碼在執行時通過虛擬機器(JAVA的JVM,PHP的Zend虛擬機器)做一次轉換, 生成機器指令, 因此能夠更好的跨平台執行。

位元組碼是一種中間狀態(中間碼)的二進位制程式碼(檔案)。需要直譯器轉譯後才能成為機器碼。

通過介紹我們可以看到,CPU只能執行機器碼,但為了實現應用跨硬體平台,我們就為不同的程式語言實現了一個虛擬機器,而這個虛擬機器將我們寫的程式碼編譯成二進位制程式碼(檔案),這個二進位制程式碼就叫位元組碼,也叫中間碼。Zend虛擬機器編譯好的位元組碼就叫opcode(其實是一系列opcode)。

接下來咱們再介紹opcode cache與JIT。

JIT

目前PHP還沒有引入JIT技術,不過鳥哥說在下一個大版本的 PHP 可能帶來JIT新特性。讓我們拭目以待吧!不過JIT在JAVA生態中是很成熟的技術了,所以就說說JAVA的JIT。

JIT 是 just in time 的縮寫, 也就是即時編譯編譯器。使用即時編譯器技術,能夠加速 Java 程式的執行速度。

通常通過 javac 將程式原始碼編譯,轉換成 java 位元組碼,JVM 將位元組碼其翻譯成對應的機器指令(機器碼),逐條讀入,逐條解釋翻譯。很顯然,經過解釋執行,其執行速度必然會比可執行的二進位制位元組碼程式慢很多。為了提高執行速度,引入了 JIT 技術。

JIT 把翻譯過的機器碼儲存起來,以備下次使用(這裡面肯定有個類似與LRU的演算法)。可見JIT要做的很簡單,就是把中間碼翻譯成的機器碼暫時(儲存多久,怎麼選擇這裡不做介紹)儲存起來,這樣再用到這個機器碼的時候,就少了一次翻譯。

opcode cache

光聽名字就知道,就是將中間碼(一系列opcode組成的二進位制檔案)快取起來,參照官網的話:OPcache improves PHP performance by storing precompiled script bytecode in shared memory, thereby removing the need for PHP to load and parse scripts on each request.

那說說為什麼需要opcode cache?

PHP程式碼的生命週期

從PHP解析器執行一個PHP指令碼,到輸出指令碼內容,主要經歷五個步驟:Zend引擎讀取檔案,詞法分析,語法分析與語意分析、建立要中間碼,執行中間碼,如下圖

每一次請求PHP指令碼都會執行一遍以上步驟。如果PHP程式碼沒有變化,那麼opcode也不會變化,顯然沒有必要每次都生成opcode,於是我們可以把編譯好的opcode快取下來,以後如果PHP程式碼沒有變,就直接存取快取中編譯好的opcode。

啟用opcode快取之後的流程圖如下所示:

總結

簡單點描述JAVA的JIT是用來快取CPU執行的機器碼的,opcode cache是用來快取Zend虛擬機器用的中間碼的。

相關教學:PHP視訊教學

以上就是opcode cache與JIT之間有哪些區別的詳細內容,更多請關注TW511.COM其它相關文章!