日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP內核探索 —— 操作碼OpCode:計算機最終是執行這些OpCode

瀏覽:215日期:2022-09-16 13:14:52

運行一段PHP代碼主要有兩個階段:編譯和執行。 當然編譯過程中還包括詞法分析語法分析不同階段和細節,這里我們將其作為一個整體。在這兩個階段之間,PHP代碼會被編譯成opcode,可以將其認為是引擎的一個中間語言,編輯階段把PHP源碼生成opcode,然后在執行階段執行這些opcode。這篇文章將簡單的介紹opcode。

PHP代碼編譯之后會生成許多的op,每一個op都是一個zend_op類型的c變量。相關的定義可以在{PHPSRC}/Zend/zend_compile.h中看到:

struct _zend_op { opcode_handler_t handler; znode result; znode op1; znode op2; ulong extended_value; uint lineno; zend_uchar opcode; }; typedef struct _zend_op zend_op;

簡單的說說這幾個字段:

1. result,op1,op2

這三個字段都是znode類型,它們是op的操作數和操作結果載體,當然并不是每個op都需要使用這三個字段,根據op的功能不同,會使用其中某些字段。比如類型為ZEND_ECHO的op值需要使用op1,功能就是將op1中的相應的值輸出。一會再單獨介紹znode類型。

2. opcode

opcode的類型為zend_uchar,zend_uchar實際上就是unsigned char,此字段保存的整形值即為op的編號,用來區分不同的op類型,opcode的可取值都被定義成了宏,可以在{PHPSRC}/Zend/zend_vm_opcodes.h中看到這些宏的定義,類似如下:

#define ZEND_NOP 0 #define ZEND_ADD 1 #define ZEND_SUB 2 #define ZEND_MUL 3 #define ZEND_DIV 4 #define ZEND_MOD 5 #define ZEND_SL6 #define ZEND_SR7 #define ZEND_CONCAT 8 #define ZEND_BW_OR 9 #define ZEND_BW_AND 10 //......

3. handler

op的執行句柄,其類型為opcode_handler_t,opcode_handler_t的類型定義為typedef int (ZEND_FASTCALL *opcode_handler_t) (ZEND_OPCODE_HANDLER_ARGS); 這個函數指針為op定義了執行方式,每一種opcode字段都對應一個種類的handler,比如opcode= 38 (ZEND_ASSIGN), 那么其對應的handler對應的就是static int ZEND_FASTCALL? ZEND_ASSIGN_**種類的handler,根據op操作數類型的不同,可以確定到這個種類中的某一個具體的函數,比如如果$a = 1;這樣的代碼生成的op,操作數為const和cv,最后就能確定handler為函數ZEND_ASSIGN_SPEC_CV_CONST_HANDLER,這些handler函數都定義在{PHPSRC}/Zend/zend_vm_execute.h中,此文件可以由一個PHP腳本生成,其中也定義了通過op來映射得到其hander的算法。

4. lineno

op對應源代碼文件中的行號。

5. extended_value

擴展字段暫時不介紹

操作數znode簡介

操作數字段是這個類型中比較重要的部分了,其中op1,op2,result三個操作數定義為znode類型,znode相關定義在此文件中:

typedef struct _znode { int op_type; union { zval constant; zend_uint var; zend_uint opline_num; /* Needs to be signed */ zend_op_array *op_array; zend_op *jmp_addr; struct { zend_uint var; /* dummy */ zend_uint type; } EA; } u; } znode;

znode類型中定義了兩個字段:

1. op_type

這個int類型的字段定義znode操作數的類型,這些類型的可取值的宏定義在此文件中

#define IS_CONST (1<<0) #define IS_TMP_VAR (1<<1) #define IS_VAR (1<<2) #define IS_UNUSED (1<<3) /* Unused variable */ #define IS_CV (1<<4) /* Compiled variable */IS_CONST:表示常量,例如$a = 123; $b = 'hello';這些代碼生成OP后,123和'hello'都是以常量類型操作數存在。IS_TMP_VAR:表示臨時變量,臨時變量一般在前面加~來表示,這是一些OP執行過程中需要用到的中間變量,例如初始化一個數組的時候,就需要一個臨時變量來暫時存儲數組zval,然后將數組賦值給變量。IS_VAR:?一般意義上的變量,以$開發表示,此種變量本人目前研究的較少,暫不介紹IS_UNUSED :?暫時不介紹,從名字來看應該是標識為不使用IS_CV:這種類型的操作數比較重要,此類型是在PHP后來的版本中(大概5.1)中才出現,CV的意思是compiled variable,即編譯后的變量,變量都是保存在一個符號表中,這個符號表是一個哈希表,試想如果每次讀寫變量的時候都需要到哈希表中去檢索,勢必會對效率有一定的影響,因此在執行上下文環境中,會將一些編譯期間生成的變量緩存起來,此過程以后再詳細介紹。此類型操作數一般以!開頭表示,比如變量$a=123;$b='hello'這段代碼,$a和$b對應的操作數可能就是!0和!1, 0和1相當于一個索引號,通過索引號從緩存中取得相應的值。

2. u

此字段為一個聯合體,根據op_type的不同,u取不同的值。比如op_type=IS_CONST的時候,u中的constant保存的就是操作數對應的zval結構。例如$a=123時,123這個操作數中,u中的constant是一個IS_LONG類型的zval,其值lval為123。

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品亚洲欧美| av资源亚洲| 久久国产精品久久久久久电车| 日韩欧美二区| 久久在线电影| 免费视频一区二区| 国产精品亚洲四区在线观看 | 久久国产日韩欧美精品| 亚洲精品韩国| 国产精品二区影院| 亚洲www免费| 妖精视频成人观看www| 亚洲精品激情| 久久影院一区二区三区| 丝袜av一区| 亚洲综合福利| 精品中文字幕一区二区三区| av高清一区| 日韩三级视频| 91欧美日韩| 中文久久精品| 国产精品亲子伦av一区二区三区| 精品国内亚洲2022精品成人| 久久91导航| 亚洲午夜免费| 狠狠久久伊人中文字幕| 亚洲一区日韩| 久久精品国产99国产精品| 欧美成人精品| 国产精品久久久久久久久久白浆 | 久久精品亚洲一区二区| 亚洲国产成人精品女人| 清纯唯美亚洲综合一区| 欧美日韩免费观看视频| 天堂精品久久久久| 成人欧美一区二区三区的电影| 国精品一区二区三区| 国产欧美一区二区三区米奇| 亚洲成人精品| 国产精品久久久久77777丨| 欧美日韩在线播放视频| 日本欧美韩国一区三区| 丝袜诱惑一区二区| 亚洲欧美一级| 91精品亚洲| 欧美激情一区| 亚洲精品护士| 免费精品国产的网站免费观看| 国产精品久久乐| 中文字幕日韩高清在线| 99久精品视频在线观看视频| 日韩av午夜在线观看| 午夜影院欧美| 欧美韩日一区| 久久精品99国产精品日本| 神马久久午夜| 麻豆精品国产91久久久久久| 亚洲综合色婷婷在线观看| 在线日韩一区| 97人人精品| 国产日产精品_国产精品毛片| 国产亚洲在线| 99精品在线免费在线观看| 精品久久一区| 国产欧美日韩亚洲一区二区三区| 先锋影音久久久| 成人日韩在线观看| 国模大尺度视频一区二区| 日韩福利视频导航| 免费黄网站欧美| 狠狠色综合网| 激情欧美一区| 久久精品国产68国产精品亚洲| 久久精品免视看国产成人| 免费不卡在线观看| 亚洲一区区二区| aa亚洲婷婷| 欧美+亚洲+精品+三区| av高清不卡| 91亚洲国产成人久久精品| 久久精品欧洲| 免费日韩成人| 欧美激情福利| 美女高潮久久久| 欧美黑人做爰爽爽爽| 国产午夜久久av| 日韩av午夜在线观看| 欧美视频精品全部免费观看| 青青青国产精品| 国产亚洲欧美日韩在线观看一区二区 | 亚洲va久久| 三级欧美韩日大片在线看| 亚洲一区欧美二区| 久久国产精品亚洲77777| 亚洲高清不卡| 亚洲综合电影一区二区三区| 免费看欧美美女黄的网站| 一区二区三区四区在线观看国产日韩| 爽好久久久欧美精品| 婷婷视频一区二区三区| 欧美久久亚洲| 久久精品九色| 亚洲精品一区三区三区在线观看| 国产精品久久久久av电视剧| 激情欧美亚洲| 亚洲最新av| 欧美永久精品| 国产精品xxx| 日韩黄色大片| 久久国产影院| 噜噜噜躁狠狠躁狠狠精品视频 | 国内在线观看一区二区三区| 欧美男人天堂| 欧美特黄一区| 91亚洲精品在看在线观看高清| 国产日韩欧美中文在线| 精品久久精品| 婷婷成人在线| 亚洲三级av| 国产日产精品_国产精品毛片 | 国内一区二区三区| 亚洲国内欧美| 日本不卡一区二区| 精品久久久久久久| 99精品视频在线| 一区二区亚洲视频| 国产精品视频一区二区三区四蜜臂 | 亚洲国产专区校园欧美| 亚洲午夜久久| 国际精品欧美精品| 亚洲欧美日本国产专区一区| 国产伦理一区| 免费污视频在线一区| 亚洲精品影视| 麻豆精品蜜桃视频网站| 极品裸体白嫩激情啪啪国产精品| 在线精品视频一区| 欧美国产极品| 欧美a级一区| 国产精品调教视频| 91精品电影| 欧美精品第一区| 亚洲欧美日韩综合国产aⅴ| 日韩精品国产欧美| 久久久蜜桃一区二区人| 日韩国产一二三区| 欧美综合另类| 国产乱人伦丫前精品视频| 久久人人99| 在线免费观看亚洲| 色综合www| 国产伦精品一区二区三区在线播放| 日韩一区亚洲二区| 一级欧美视频| 日韩欧美视频专区| 国产午夜久久av| 久久xxxx精品视频| 中文在线а√天堂| 国产精品一线| 一级欧美视频| 午夜久久福利| 日韩国产一区二区三区| 国产精品nxnn| 日韩精选在线| 久久高清免费观看| 国产91精品对白在线播放| 精品不卡一区| 国产伦理久久久久久妇女| 久久国产精品久久w女人spa| 亚洲人成在线网站| 国产精品66| 亚洲免费一区三区| 国产精品日本| 91精品婷婷色在线观看| 美女av在线免费看| 欧美激情视频一区二区三区免费| 亚洲精品第一| 美女国产精品| 欧美网站在线| 欧美日韩黑人| 99精品视频在线观看免费播放| 国产高潮在线| 国产精品一区毛片| 亚洲毛片一区| 在线免费观看亚洲| 在线亚洲欧美| 日韩午夜高潮| 久久中文字幕二区| 欧美日韩国产v| 超级白嫩亚洲国产第一| 日韩av有码| 色婷婷亚洲mv天堂mv在影片| 久久超级碰碰| 久久丁香四色| 欧美精品导航| 国语对白精品一区二区| 欧美激情在线精品一区二区三区| 欧美久久亚洲| 日韩精品1区2区3区| 中文在线日韩|