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

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

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

瀏覽:211日期: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| 午夜久久影院| 亚洲免费网址| 国产精品美女久久久| 日韩精品电影| 88xx成人免费观看视频库| 亚洲1234区| 秋霞影视一区二区三区| 亚洲韩日在线| 在线视频免费在线观看一区二区| 亚洲欧美高清| 香蕉久久一区| 国产精品美女午夜爽爽| 成人污污视频| 秋霞影院一区二区三区| 免费久久久久久久久| 丝袜美腿成人在线| 日本va欧美va瓶| 国产精品网站在线看| 日本在线观看不卡视频| 日本v片在线高清不卡在线观看| 日本久久一区| 欧美成人aaa| 日韩精品专区| 亚洲性图久久| 亚洲天堂免费| 国产精东传媒成人av电影| 国产一区二区三区探花| 激情综合自拍| 亚洲精一区二区三区| 久久国产精品美女| 欧美成a人国产精品高清乱码在线观看片在线观看久| 午夜精品久久久久久久久久蜜桃| 香蕉国产精品| 99视频一区| 国产欧美三级| 欧产日产国产精品视频| 水野朝阳av一区二区三区| 国产精品欧美三级在线观看| 亚洲www免费| 亚洲aa在线| 国产资源在线观看入口av| 91久久久精品国产| 69精品国产久热在线观看| 精品国产18久久久久久二百| 米奇777超碰欧美日韩亚洲| 日韩精品亚洲专区| 天堂av在线| 免播放器亚洲一区| 精品中文字幕一区二区三区av| 亚洲人成在线影院| 精品一区二区三区中文字幕视频 | 国产精品视频首页| 日韩国产一区二区| 亚洲精品女人| 国产成人精品三级高清久久91| 激情欧美一区二区三区| 91九色综合| 国产aa精品| 每日更新成人在线视频| 国产欧美日韩一区二区三区四区| 久久精品二区三区| 欧美日韩一区二区三区不卡视频| 久久国产直播| 国产精品天堂蜜av在线播放| 欧美另类综合| 国模大尺度视频一区二区| 免费人成精品欧美精品| 91欧美在线| 亚洲毛片在线| 在线看片不卡| 久久69成人| 综合在线一区| 电影91久久久| 欧美亚洲二区| 亚洲一区日本| 涩涩av在线| 国产精品欧美三级在线观看| 日韩精品一二三四| 久久精品导航| 91日韩在线| 麻豆精品久久| 天堂精品久久久久| 91精品91| 精品捆绑调教一区二区三区| 国产日韩欧美一区二区三区| 香蕉久久国产| 四季av一区二区凹凸精品| 免费久久精品视频| 欧美色图一区| 四虎国产精品免费观看| 国产精品一区免费在线| 亚洲一区二区免费看| 999国产精品999久久久久久| 国产精品久av福利在线观看| 日韩一区二区三区高清在线观看| 精品日韩毛片| 精品日韩一区| 久久久国产精品入口麻豆| 亚洲bt欧美bt精品777| 激情91久久| 日韩精品专区| 国产一区二区三区日韩精品| 亚州欧美在线| 久久不射中文字幕| 日韩午夜电影| 999国产精品999久久久久久| 日韩国产一区| 毛片在线网站| 福利一区视频| 精品三级av在线导航| 久久精品国产精品亚洲毛片| 欧美韩一区二区| 国产精品黄色片| 国产欧美高清视频在线| 91嫩草精品| 69精品国产久热在线观看| 日韩三级精品| 夜夜嗨一区二区| 9国产精品视频| 最新亚洲激情| 亚洲欧美日韩国产一区| 国产一区日韩欧美| 伊人久久大香线蕉av不卡| 成人免费电影网址| 久久久蜜桃一区二区人| 啪啪国产精品| 亚洲不卡系列| 日本久久黄色| 久久uomeier| 久久精品影视| 亚洲欧洲高清| 91精品国产乱码久久久久久久| 成人在线观看免费视频| 国产精品1区在线| 精品久久免费| 黄色在线观看www| 久久久水蜜桃av免费网站| 国产第一亚洲| 日韩不卡免费高清视频| 欧美 日韩 国产精品免费观看| 在线一区视频观看| 午夜日韩福利| 日韩 欧美一区二区三区| 国产精品tv| 国产综合色区在线观看| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 91日韩免费| 99久久夜色精品国产亚洲1000部| 1024精品久久久久久久久| 亚洲伊人精品酒店| 久久不卡日韩美女| 亚洲91精品| 中文字幕一区二区三区日韩精品| 日本天堂一区| 老牛国内精品亚洲成av人片| 色在线视频观看| 亚洲欧洲日本mm| 日韩av成人高清| 国产一区二区久久久久| 欧美亚洲精品在线| 亚洲三级网址| 日本成人在线网站| 美女久久久精品| 久久国产电影| 亚洲精品激情| 精品一区二区三区的国产在线观看| 精品欧美一区二区三区在线观看| 亚洲免费激情| 久久国产日韩欧美精品| 久久精品三级| 99国产精品99久久久久久粉嫩| 国产欧美日韩| 国产白浆在线免费观看| 国产模特精品视频久久久久| 国产欧美高清视频在线| 日韩av有码| 免费黄色成人| 日韩激情一二三区| 国内在线观看一区二区三区| 亚洲欧美日韩高清在线| 日韩精品1区2区3区| 四虎成人av| 日精品一区二区三区| 精品国产乱码久久久久久1区2匹| 午夜国产一区二区| 美女精品久久| 综合精品一区| 日韩成人高清| 日韩av中文字幕一区二区| 精品国产乱码| 亚洲免费毛片| 精品久久久久久久| 日本中文字幕一区二区视频| 日韩精品欧美激情一区二区|