PHP編譯原理之Opcode

2021-08-03 04:56:20 字數 1506 閱讀 7380

一.編譯原理的過程

編譯程式的工作過程一般可以劃分為五個階段:

1)詞法分析:輸入源程式,對構成源程式的字串進行掃瞄和分解,識別出乙個個的單詞

(如基本字、標識 符、常量、運算子、標點符、左右括號等)

描述詞法規則通常用:正規式 和 有限自動機

依循的原則:詞法規則。。。線性分析。。。

2)語法分析:在詞法分析的基礎上,根據語言的語法規則,把單詞符號串分解成各類語法單位(語法範疇)               (如,「短語」、「子句」、「句子」、「程式段」等)

描述語法規則通常用:上下文無關文法

依循的原則:語法規則。。。層次結構分析。。。。。

3)語義分析與中間**產生:對語法分析所識別出的各類語法範疇,分析其含義,並進行初步翻譯(產生中間**)。

描述語義規則通常用:屬性文法

依循的原則:語義規則。。。

4)優化:對前段產生的中間**進行加工變換,以便在最後階段能產生出更高效的目標**。

依循的原則:程式的等價不變換規則。

5)目標**生成:把中間**(或經優化處理後)變換成特定機器上的第幾語言**。

這一階段實現了最後的翻譯。

注: php的編譯過程可以參考鳥哥的文章:深入理解php原理之opcodes

二、opcode的作用

1)編譯原理的中間過程會產生一種中間**(語言),php由zend引擎(c語言編寫)編譯後的中間**為opcode然後再交由zend引擎處理,如同c語言編譯後彙編**然後再交由彙編編譯處理一樣(也可以直接設定編譯成二進位制檔案然後轉為機器碼),

不是不可以直接生成機器碼讓計算機去執行,而是通過這個過程將複雜的問題分步進行,並且可以根據當前系統環境的不同而對opcode做進一步的優化

,一步一步地去解析和進行。

注: 對於php的編譯過程:關於php的編譯和執行分離

php對程式設計師的要求更高

php雖然是一種編譯型指令碼語言(

每次都是先編譯後執行,不像其他語言直接執行編譯檔案

), 但是它的編譯速度非常快, 它的編譯不做任何語義優化, 就是簡單的忠實的把你所寫的**翻譯成對應的opcodes. 而其他語言因為在編譯器做很多的優化工作, 會造成編譯比較重, 也一定程度上要求它們分離.

所以, 理論上來說, 通過編譯執行分離, 想達到原始碼加密, 是不會有什麼太大收效的, 因為它很容易被反向.

另外, 編譯直接分離, 並不會帶來特別大的收益, 反而會降低除錯部署的效率(想想, 修改, 編譯, 發布, 看效果), 並且apc等opcode cache工具, 已經很成熟了..

2)生成的opcode作為一種中間語言,

可以幫助實現php源程式**的不開源

,如果你不想別人知道你的php**是怎麼寫的,那你可以直接使用apc擷取生成opcode快取檔案,然後使用自己的php擴充套件加密程式對opcode檔案進行加密和解密,在zend引擎對opcode進行解析前進行解密然後再執行。

具體可參考:實現php的編譯執行分離

PHP快取之Opcode快取

什麼是opcode快取?當直譯器完成對指令碼 的分析後,便將他們聲稱可以直接執行的中間 也成為操作碼 operate code,opcode opcode cache的目的是避免重複編譯,減少cpu和記憶體的開銷。但是一般動態 的效能瓶頸都在io操作以及資料庫操作,那麼opcode快取能夠帶來的優化...

php核心分析 opcode

檢視opcode php是先把原始碼解析成opcode,然後再把opcode傳遞給zend vm進行執行的。乙個opcode的結構 struct zend op 在php7中,我們能很方便用phpdbg來檢視乙個檔案或者乙個函式的opcode了。至於phpdbg的使用,現在網上介紹不多,不過好在有很...

pyc逆向之opcode簡單置換

最近做了一道pyc的逆向題,主要難點在於python環境的opcode被置換,就簡單記錄一下相關知識。opcode其實是指python原始碼的操作碼,python源 py編譯後可以得到二進位制檔案 pyc,pyc檔案中就含有opcode序列。對於不同版本的python,其opcode是不完全相同的,...