標籤:ar 使用 on cti 代碼 line res br ui
php的詞法分析、文法分析大多採用Flex/Bison處理
在文法分析完成後,由zend引擎產生中間代碼(使用opcache可以省略編譯階段)opcode,PHP是構建在Zend虛擬機器(Zend VM)之上的。PHP的opcode就是Zend虛擬機器中的指令
在PHP實現內部,opcode由如下的結構體表示:
struct _zend_op {
opcode_handler_t handler; // 執行該opcode時調用的處理函數
znode result;
znode op1;
znode op2;
ulong extended_value;
uint lineno;
zend_uchar opcode; // opcode代碼
};
由上可知所謂的opcode就是zend虛構的有c結構體標識的一種指令集(大概有130多個)
例如如下代碼是在編譯器遇到print語句的時候進行編譯的函數:
void zend_do_print(znode *result,const znode *arg TSRMLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->result.op_type = IS_TMP_VAR;
opline->result.u.var = get_temporary_variable(CG(active_op_array));
opline->opcode = ZEND_PRINT;
opline->op1 = *arg;
SET_UNUSED(opline->op2);
*result = opline->result;
}
這個函數新建立一條zend_op,將傳回值的類型設定為臨時變數(IS_TMP_VAR),並為臨時變數申請
空間, 隨後指定opcode為ZEND_PRINT,並將傳遞進來的參數賦值給這條opcode的第一個運算元。這樣
在最終執行這條opcode的時候, Zend引擎能擷取到足夠的資訊以便輸出內容。(實質就是zend解析print語句時會通過zend_do_print函數去產生這個中間代碼opcode)
opcode被儲存在op_array結構體中,再由execute函數順序執行opcode代碼。
php 中間代碼opcode