本篇文章主要講述的是opcode cache與JIT的區別,具有一定學習價值,有興趣的朋友可以了解一下,希望對你能有所幫助。
要說明opcode cache與JIT的差別,得先明白,字節碼,又叫中間碼與機器碼的差別。
一條機器指令。例如我們組合語言寫的一條操作語句。
學名機器語言指令,有時也稱為原生碼(Native Code),是電腦的CPU可直接解讀的資料 。
機器碼是電腦CPU直接讀取運作的機器指令,運作速度最快,但是非常晦澀難懂,也比較難編寫,一般從業人員接觸不到。
而且機器碼不支援跨平台,簡單點將就是不同的CPU所使用的機器碼是不一樣的。
是一種包含執行程式、由一序列 op 程式碼/資料對 組成的二進位檔案。字節碼是一種中間碼,它比機器碼更抽象,需要直譯器轉譯後才能成為機器碼的中間碼。
字節碼主要為了實現特定軟體運作和軟體環境、與硬體環境無關。字節碼的實作方式是透過編譯器和虛擬機器。編譯器將原始碼編譯成字節碼,特定平台上的虛擬機器將字節碼轉譯為可以直接執行的指令。字節碼的典型應用為Java bytecode,那麼PHP的就是一系列opcode組成的二進位。
字節碼在運行時透過虛擬機器(JAVA的JVM,PHP的Zend虛擬機)做一次轉換, 產生機器指令, 因此能夠更好的跨平台運行。
字節碼是一種中間狀態(中間碼)的二進位程式碼(檔案)。需要直譯器轉譯後才能成為機器碼。
透過介紹我們可以看到,CPU只能執行機器碼,但為了實現應用跨硬體平台,我們就為不同的程式語言實作了一個虛擬機,而這個虛擬機將我們寫的程式碼編譯成二進位碼(檔),這個二進位程式碼就叫字節碼,也叫中間碼。 Zend虛擬機器編譯好的字節碼就叫opcode(其實是一系列opcode)。
接下來咱們再介紹opcode cache與JIT。
目前PHP還沒有引入JIT技術,不過鳥哥說在下一個大版本的 PHP 可能帶來JIT新特性。讓我們拭目以待吧!不過JIT在JAVA生態中是很成熟的技術了,所以就說說JAVA的JIT。
JIT 是 just in time 的縮寫, 也就是即時編譯編譯器。使用即時編譯器技術,能夠加速 Java 程式的執行速度。
通常透過 javac 將程式原始碼編譯,轉換成 java 字節碼,JVM 將字節碼其翻譯成對應的機器指令(機器碼),逐條讀入,逐條解釋翻譯。很顯然,經過解釋執行,其執行速度必然會比可執行的二進位字節碼程式慢很多。為了提高執行速度,引入了 JIT 技術。
JIT 把翻譯過的機器碼保存起來,以備下次使用(這裡面肯定有個類似與LRU的演算法)。可見JIT要做的很簡單,就是把中間碼翻譯成的機器碼暫時(保存多久,怎麼選擇這裡不做介紹)保存起來,這樣再用到這個機器碼的時候,就少了一次翻譯。
光聽名字就知道,就是將中間碼(一系列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虛擬機器用的中間碼的。
#以上是opcode cache與JIT之間有哪些區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!