电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

PHP內(nèi)核探索 —— PHP腳本的執(zhí)行細(xì)節(jié):PHP、C、匯編、機(jī)器碼

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

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

那么,PHP語(yǔ)言究竟如何被執(zhí)行呢?

PHP語(yǔ)言到C語(yǔ)言之間的轉(zhuǎn)換如果使用“翻譯”這個(gè)詞是不夠準(zhǔn)確的,因?yàn)橐娌皇菍HP語(yǔ)言轉(zhuǎn)換成C語(yǔ)言,然后將轉(zhuǎn)換后的C語(yǔ)言編譯鏈接執(zhí)行。引擎在解析PHP代碼的時(shí)候通常是分為兩個(gè)部分,編譯和執(zhí)行:

編譯階段:引擎把PHP代碼轉(zhuǎn)換成opcode中間代碼執(zhí)行階段:引擎解釋并執(zhí)行編譯階段產(chǎn)生的opcode

關(guān)于op code會(huì)有專門的文章來(lái)介紹,現(xiàn)在網(wǎng)絡(luò)上也已經(jīng)有很多相關(guān)內(nèi)容的文章,總之PHP代碼會(huì)被編譯成_zend_op_array的形式,這是一個(gè)結(jié)構(gòu)體,其中包括很多相關(guān)屬性,以及最重要的成員zend_op *opcodes,即opcode的數(shù)組。執(zhí)行階段引擎會(huì)按照順序執(zhí)行各個(gè)opcode。

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

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

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

那么引擎是如何通過(guò)這些op handler實(shí)現(xiàn)PHP語(yǔ)言的特性的呢?這里我舉一個(gè)最簡(jiǎn)單的例子,考慮下面只有一行的PHP代碼:

<?php$a = 123;?>

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

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

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

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

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

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: Jaeaiot捷易科技-英伟达AI显卡模组/GPU整机服务器供应商 | 硬度计_影像测量仪_维氏硬度计_佛山市精测计量仪器设备有限公司厂家 | 驾驶式洗地机/扫地机_全自动洗地机_工业洗地机_荣事达工厂官网 | 齿轮减速电机一体机_蜗轮蜗杆减速马达-德国BOSERL齿轮减速机带电机生产厂家 | 德州万泰装饰 - 万泰装饰装修设计软装家居馆 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 拉曼光谱仪_便携式|激光|显微共焦拉曼光谱仪-北京卓立汉光仪器有限公司 | 北京公积金代办/租房发票/租房备案-北京金鼎源公积金提取服务中心 | 聚氨酯保温钢管_聚氨酯直埋保温管道_聚氨酯发泡保温管厂家-沧州万荣防腐保温管道有限公司 | 槽钢冲孔机,槽钢三面冲,带钢冲孔机-山东兴田阳光智能装备股份有限公司 | 信阳市建筑勘察设计研究院有限公司 | 越南专线物流_东莞国际物流_东南亚专线物流_行通物流 | 曙光腾达官网-天津脚手架租赁-木板架出租-移动门式脚手架租赁「免费搭设」 | 【365公司转让网】公司求购|转让|资质买卖_股权转让交易平台 | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | 别墅图纸超市|别墅设计图纸|农村房屋设计图|农村自建房|别墅设计图纸及效果图大全 | 防火窗_耐火窗_防火门厂家_防火卷帘门-重庆三乐门业有限公司 | 手持式3d激光扫描仪-便携式三维立体扫描仪-北京福禄克斯 | 计算机毕业设计源码网| 硬度计_影像测量仪_维氏硬度计_佛山市精测计量仪器设备有限公司厂家 | 长沙中央空调维修,中央空调清洗维保,空气能热水工程,价格,公司就找维小保-湖南维小保环保科技有限公司 | 清洁设备_洗地机/扫地机厂家_全自动洗地机_橙犀清洁设备官网 | 活性炭厂家-蜂窝活性炭-粉状/柱状/果壳/椰壳活性炭-大千净化-活性炭 | 高柔性拖链电缆-聚氨酯卷筒电缆-柔性屏蔽电缆厂家-玖泰电缆 | 彼得逊采泥器-定深式采泥器-电动土壤采样器-土壤样品风干机-常州索奥仪器制造有限公司 | 14米地磅厂家价价格,150吨地磅厂家价格-百科 | 法兰螺母 - 不锈钢螺母制造厂家 - 万千紧固件--螺母街 | 蜂窝块状沸石分子筛-吸附脱硫分子筛-萍乡市捷龙环保科技有限公司 | 钢丝绳探伤仪-钢丝绳检测仪-钢丝绳探伤设备-洛阳泰斯特探伤技术有限公司 | 全自动过滤器_反冲洗过滤器_自清洗过滤器_量子除垢环_量子环除垢_量子除垢 - 安士睿(北京)过滤设备有限公司 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 商用绞肉机-熟肉切片机-冻肉切丁机-猪肉开条机 - 广州市正盈机械设备有限公司 | 合景一建-无尘车间设计施工_食品医药洁净车间工程装修总承包公司 | 玻璃钢型材-玻璃钢风管-玻璃钢管道,生产厂家-[江苏欧升玻璃钢制造有限公司] | 浩方智通 - 防关联浏览器 - 跨境电商浏览器 - 云雀浏览器 | 超声波乳化机-超声波分散机|仪-超声波萃取仪-超声波均质机-精浩机械|首页 | 合景一建-无尘车间设计施工_食品医药洁净车间工程装修总承包公司 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 超声波破碎仪-均质乳化机(供应杭州,上海,北京,广州,深圳,成都等地)-上海沪析实业有限公司 | 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 |