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

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

PHP內核探索 —— PHP腳本的執行細節:PHP、C、匯編、機器碼

瀏覽:118日期:2022-09-16 13:13:50

眾所周知,計算機的CPU只能執行二進制的機器碼,每種CPU都有對應的匯編語言,匯編語言編譯器將匯編語言翻譯成二進制的機器語言,然后CPU開始執行這些機器碼。匯編語言作為機器語言與程序設計者之間的一個層,給我們帶來了很多方便,程序員不需要用晦澀的01數字來書寫程序,當然人們并不滿足這樣的一個進步,于是在匯編語言之上又多了一個層——C語言,C語言更貼近人類熟悉的“自然語言”,程序設計者可以通過C語言編譯器將C源代碼文件編譯成目標文件(二進制文件,中間會先翻譯成匯編語言,然后由匯編語言生成機器碼),然后將各個目標文件連接在一起就組成了一個可執行文件。正如有人說過的一句名言“計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決”(“Any problem in computer science can be solved by another layer of indirection.”) PHP語言就是在C語言之上的一個層,PHP引擎是由C語言來實現的,因此PHP語言這一個在C之上抽象出來的層使用起來比C更簡單方便,入門門檻更低。

那么,PHP語言究竟如何被執行呢?

PHP語言到C語言之間的轉換如果使用“翻譯”這個詞是不夠準確的,因為引擎不是將PHP語言轉換成C語言,然后將轉換后的C語言編譯鏈接執行。引擎在解析PHP代碼的時候通常是分為兩個部分,編譯和執行:

編譯階段:引擎把PHP代碼轉換成opcode中間代碼執行階段:引擎解釋并執行編譯階段產生的opcode

關于op code會有專門的文章來介紹,現在網絡上也已經有很多相關內容的文章,總之PHP代碼會被編譯成_zend_op_array的形式,這是一個結構體,其中包括很多相關屬性,以及最重要的成員zend_op *opcodes,即opcode的數組。執行階段引擎會按照順序執行各個opcode。

目前5.3.2版本的PHP中,opcode一共有154種,可以在{PHPSRC}/Zend/zend_vm_opcodes.h看到這些opcode的宏定義。op的結構定義為:

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

其中的成員opcode就對應154個opcode宏定義中的一個,每一個op根據opcode和操作數的類型不同都會對應一個相關的執行句柄(opcode_handler_t handler),執行句柄是一個函數指針,op的執行執行句柄都定義在{PHPSRC}/Zend/zend_vm_execute.h中,這個文件可以通過一個PHP腳本({PHPSRC}/Zend/zend_vm_gen.php)來生成,這個PHP腳本用來生成zend_vm_opcodes.h和zend_vm_execute.h兩個文件,zend_vm_execute.h的內容會根據生成時的參數不同而不同,這里主要是可以定置zend 引擎對op的分發方式,比如用CALL,SWITCH,GOTO,默認的是用CALL,也就是函數調用,所以這里就以函數調用來簡單的介紹下這個文件的功能(文件極大,有近36000行,所以不要仔細啃),在這個文件中所有定義為 static int ZEND_FASTCALL 并且以 ZEND_* 開頭的函數就是op的句柄,此文件中第一個函數execute是執行op的主方法,以這里作為入口執行一連串的op。可以說整個PHP的功能特性都是通過這些op句柄完成的(當然這些句柄會間接調用其他模塊中的功能),那么這154個opcode如何對應到這些static int ZEND_FASTCALL? ZEND_*的執行句柄的呢?同樣在這個文件中,可以看到zend_init_opcodes_handlers函數,這個函數初始化一個 static const opcode_handler_t labels[]數組,這個 labels數組就是handlers的一張表,這個表有近4000個項,有一個算法將一個opcode映射到這個表中的一個元素,算法同樣在zend_vm_execute.h中可以找到,靠近文件結尾zend_vm_set_opcode_handler和zend_vm_get_opcode_handler就是這個算法的實現。

那么引擎是如何通過這些op handler實現PHP語言的特性的呢?這里我舉一個最簡單的例子,考慮下面只有一行的PHP代碼:

<?php$a = 123;?>

通過某種方法(以后再介紹這些方法)我們可以知道這行代碼主要生成一個zend_op,其主要成員值為:

opcode = 38? (對應#define ZEND_ASSIGN??38)op1?????? = $a ($a變量實際上是以cv形式存在,以后介紹)op2?????? = 123 (以const常量形式存在)

handler = ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(得到這個handler的名字不是一件容易的事,以后給出方法)

opcode ZEND_ASSIGN的意思是將一個常量賦值給一個cv(compiled variable),這個cv其實就是$a變量的一種存在形式。在zend_vm_execute.h中搜索到ZEND_ASSIGN_SPEC_CV_CONST_HANDLER的定義,其主要功能就是取op2的值123,將其賦值給op1的變量,當然這個過程比想象中的要復雜一些,會有變量的初始化,變量的寫時賦值等過程,以后會介紹每一個過程。這樣這條PHP語句的功能就完成了。可以看出,op handler只是按照一些固定的方式來對操作數op1 op2(可能還有result)進行操作,handler不理會這些操作數中的具體值,這些值是在編譯階段生成op的時候確定的,比如如果$a = 123 改成 $a =456,那么生成的op中op2就是456了,handler始終按照固定的方式來處理。

因此我們能知道,PHP的執行過程是先通過編譯器將PHP代碼編譯成op code,然后然后zend虛擬機按照一定順序執行這些opcode,具體是將每個opcode分發給特定的op code handler。

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩成人三级| 免费在线成人| 欧美aⅴ一区二区三区视频| 中文视频一区| 男人天堂欧美日韩| 尹人成人综合网| 欧美日韩在线二区| 亚洲精品在线影院| 高清一区二区三区| 麻豆精品少妇| 久久精品国产精品亚洲毛片| 国产劲爆久久| 精品一区二区三区的国产在线观看 | 热三久草你在线| 国产精品国码视频| 国产精品任我爽爆在线播放| 欧美亚洲免费| 国产福利资源一区| 精品视频黄色| 高潮久久久久久久久久久久久久| 精品三级久久久| 国产精品嫩草影院在线看| 欧美日韩一区二区三区不卡视频| 日韩精品免费视频人成| 亚洲尤物av| 日韩精品欧美精品| 国产日韩欧美在线播放不卡| 99在线精品免费视频九九视| 伊人久久成人| 亚洲v天堂v手机在线| 91免费精品国偷自产在线在线| 欧美久久精品| 久久精品国产亚洲aⅴ | 日韩在线卡一卡二| 免费成人av在线播放| 日韩区一区二| 国产精品99久久免费| 日本一二区不卡| 久久久久久色| 国产精品丝袜在线播放| 精品72久久久久中文字幕| 国产精品久久久久蜜臀| 欧美亚洲激情| 日韩综合一区二区| 日韩在线观看中文字幕| 国产欧美激情| 欧美激情另类| 一区视频在线| 青青草精品视频| 国内精品伊人| 日韩深夜视频| 在线精品一区二区| 麻豆国产91在线播放| 特黄毛片在线观看| 丝袜美腿亚洲一区二区图片| 石原莉奈在线亚洲二区| 国产精品巨作av| 欧美日韩精品一区二区视频| 日韩高清成人在线| 人人爽香蕉精品| 电影91久久久| 亚洲欧洲一区二区天堂久久| 91成人精品在线| 亚洲国产专区| 国产免费av一区二区三区| 桃色一区二区| 欧美在线看片| av中文资源在线资源免费观看| 99国产精品免费视频观看| 综合日韩在线| 播放一区二区| 亚洲深夜福利在线观看| 最近高清中文在线字幕在线观看1| 另类激情亚洲| 日韩国产在线| 日韩欧美中文在线观看| 色在线视频观看| 日本成人在线不卡视频| 国产一在线精品一区在线观看| 欧美一区不卡| 久久香蕉精品| 97国产成人高清在线观看| 91国内精品| 亚洲男女av一区二区| 亚洲综合电影| 九九精品调教| 亚洲特色特黄| 99国产精品99久久久久久粉嫩| 在线国产一区二区| 男女精品网站| 日韩欧美中文在线观看| 日韩高清电影免费| 欧美一区精品| 国产精品免费不| 国产精品porn| 精品日产乱码久久久久久仙踪林| 精品视频在线你懂得| 精品九九久久| 中文在线中文资源| 久久狠狠婷婷| 欧美另类专区| 亚洲在线观看| 日本成人中文字幕| 国产日韩欧美一区二区三区 | 久久精品国产亚洲aⅴ| 国产一区不卡| 久久九九精品| 热久久免费视频| 欧美在线看片| 久久香蕉精品香蕉| 日韩国产一区二区| 日韩午夜在线| 日本va欧美va瓶| 国产一区三区在线播放| 久久视频一区| 亚洲日韩中文字幕一区| 国产精品地址| 久久美女精品| 日韩福利视频网| 国产成年精品| 99国产精品| 国产精品久久久亚洲一区| 日韩欧美精品| 综合激情五月婷婷| 欧美国产三级| 日韩精品一区二区三区免费观影| 久久av在线| 精品久久精品| 野花国产精品入口| 国产精品亚洲一区二区在线观看| 中文字幕成在线观看| 免费久久99精品国产自在现线| 国产欧美高清视频在线| 99国产精品一区二区| 日韩国产在线观看一区| 国产h片在线观看| 日韩一区二区三区精品| 日韩欧美一区二区三区在线视频| 亚洲视频国产精品| 国产va免费精品观看精品视频| 久久中文视频| 午夜电影一区| 日韩另类视频| 国产欧美日韩在线一区二区 | 成人国产精品一区二区免费麻豆| 午夜久久一区| 欧美一区影院| 亚洲福利国产| 国产极品久久久久久久久波多结野| 亚洲香蕉网站| 国产精品一区二区三区av| 精品一区在线| 久久av资源| 在线国产一区二区| 麻豆精品蜜桃视频网站| 日韩制服丝袜先锋影音| 国产一区二区三区国产精品| 亚洲黄色在线| 成午夜精品一区二区三区软件| 亚洲精品少妇| 在线日韩欧美| 成人午夜在线| 日韩精品中文字幕一区二区| 久久久久久久久久久妇女| 欧美a在线观看| 亚洲精品一二| 红桃视频国产一区| 日韩久久视频| 久久精品 人人爱| 亚洲一区二区日韩| 五月天久久777| 亚洲天堂资源| 久久精品国产99| 国产精品一区二区精品视频观看| 鲁大师成人一区二区三区| 日韩综合精品| 国产一区调教| 国产精品亚洲二区| 蜜臀av一区二区在线免费观看| 久久久水蜜桃av免费网站| 久久中文字幕一区二区| 日本v片在线高清不卡在线观看| 一区二区视频欧美| 桃色一区二区| 国产成人免费视频网站视频社区| 国产美女亚洲精品7777| 日韩精品a在线观看91| 亚洲日韩中文字幕一区| 午夜电影亚洲| 欧美影院三区| 久久精品亚洲人成影院 | 国产亚洲在线| 国产中文一区| 91精品国产乱码久久久久久久| 日产精品一区二区| 欧美国产另类| 久久av中文| 麻豆一区二区在线| 久久久亚洲欧洲日产| 国产精品国码视频|