保举课程:PHP教程。
C顺序正在编译时将一行行代码编译为机械码,每个操作都以为是一条机械指令,这些指令写入到编译后的二进制顺序中,执行的时分将二进制顺序load进相应的内存区域(常量区、数据区、代码区)、调配运转栈,而后从代码区肇始地位开端执行,这是C顺序编译、执行的简略进程。
一样,PHP的编译与一般的C顺序相似,只是PHP代码不编译成机械码,而是解析成为了若干条opcode数组,每一条opcode就是C外面一般的struct,含意对应C顺序的机械指令,执行的进程就是引擎顺次执行opcode,比方咱们正在PHP里界说一个变量:$a = 123;
,终极到内核里执行就是malloc一块内存,而后把值写出来。
正在zend_compile.h文件中,opcode构造:
struct _zend_op { const void *handler; //对应执行的C言语function,即每一条opcode都有一个C function解决 znode_op op1; //操作数1 znode_op op2; //操作数2 znode_op result; //前往值 uint32_t extended_value; uint32_t lineno; zend_uchar opcode; //opcode指令 zend_uchar op1_type; //操作数1类型 zend_uchar op2_type; //操作数2类型 zend_uchar result_type; //前往值类型 };
以是PHP的解析进程义务就是将PHP代码(经过词法剖析re2c,语法剖析bison)转化为opcode数组,代码里的一切信息都保留正在opcode中,而后将opcode数组交给zend引擎执行,opcode就是内核详细执行的饬令,比方赋值、加减操作、函数挪用等,每一一条opcode都对应一个解决handle,这些handler是提前界说好的C函数。
struct _zend_op_array { //co妹妹on是一般函数或类成员办法对应的opcodes疾速拜访时应用的字段 /* Co妹妹on elements */ zend_uchar type; zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */ uint32_t fn_flags; zend_string *function_name; zend_class_entry *scope; zend_function *prototype; uint32_t num_args; uint32_t required_num_args; zend_arg_info *arg_info; /* END of co妹妹on elements */ uint32_t *refcount; uint32_t last; //opcode指令数组 zend_op *opcodes; //PHP代码里界说的变量数:op_type为IS_CV的变量,没有含IS_TMP_VAR、IS_VAR的 //编译前此值为0,而后发现一个新变量这个值就加1 int last_var; //暂时变量数:op_type为IS_TMP_VAR、IS_VAR的变量 uint32_t T; //PHP变量名数组 zend_string **vars;//这个数组正在ast编译时期合营last_var用来确定各个变量的编号,十分首要的一步操作 int last_live_range; int last_try_catch; zend_live_range *live_range; zend_try_catch_element *try_catch_array; //动态变量符号表:经过static申明的 /* static variables support */ HashTable *static_variables; zend_string *filename; uint32_t line_start; uint32_t line_end; zend_string *doc_co妹妹ent; uint32_t early_binding; /* the linked list of delayed declarations */ //字面量数目 int last_literal; //字面量(常量)数组,这些都是正在PHP代码界说的一些值 zval *literals; //运转时缓存数组巨细 int cache_size; //运转时缓存,次要用于缓存一些znode_op以便于疾速猎取数据,前面独自引见这个机制 void **run_time_cache; void *reserved[ZEND_MAX_RESERVED_RESOURCES]; };
opcode指令:即PHP代码详细对应的解决举措,与二进制顺序中的代码段对应
字面量存储:PHP代码中界说的一些变量初始值、挪用的函数称号、类称号、常量称号等等称之为字面量,这些值用于执行时初始化变量、函数挪用等等
变量调配状况:与字面量相似,这里指的是以后opcodes界说了几何变量、暂时变量,每一个变量都有一个对应的编号,执行初始化依照总的数量一次性调配zval,应用时也齐全依照编号索引,而没有是依据变量名索引
从PHP代码到opcode是怎样完成的?
最容易想到的形式就是正则婚配,当然进程不这么简略。PHP编译进程包罗词法剖析、语法剖析,应用re2c、bison实现,旧的PHP版本间接天生了opcode,PHP7新增了形象语法树(AST),正在语法剖析阶段天生AST,而后再天生opcode数组
以上就是若何编译php文件的具体内容,更多请存眷资源魔其它相干文章!
标签: php php开发教程 php开发资料 php开发自学
抱歉,评论功能暂时关闭!