企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### 编译型语言和解释型语言 - 编译型语言:执行前需要经历编译过程,把源代码编译成机器语言。以后再要运行时,直接使用编译好的文件即可。(c, c++...) 优缺点:(1):一次性编译成平台相关的机器语言文件,运行时脱离开发环境,运行效率高 (2):于特定平台相关,可移植性差。 - 解释下语言:使用专门的解释器对源码卓条解释成中间语言,再将中间语言文件交给其他过程处理或直接交给机器执行。对于常见的编译步骤分为:词法分析->语法分析->代码优化和字节生成。 如php执行经过:将PHP代码经过词法分析转换成语言片段(Tokens)->将Tokens经过语法分析转换成有意义的表达式(AST抽象语法树)->再将抽象语法树经过编译过程编译成opcodes(这就是中间语言)->顺次的执行opcodes(物理机器无法识别opcodes,因此需要zend虚拟机) ![](https://img.kancloud.cn/0d/c0/0dc0362d2d4672da8340cc2d1e6b159f_872x489.png) ### php执行过程 1. Scanning(Lexing)对PHP源码进行词法分析,将源代码切割为多个字符串单元,分割后的字符串成为Token 2. Parsing 将Token进行语法分析,转换成抽象语法树(AST) 3. Compilation AST经过编译器编译成机器指令(PHP定义的一组指令表示,每个指令对应响应的处理函数),这些机器指令为Opcodes。(这里说的编译器不同与编译型语言中的编译器,AST经过编译器被编译成能被解释执行的指令,而不是汇编代码) 4. Execution zend虚拟机依次执行Opcodes,这个执行过程就是找到指令对应的处理函数,执行其中的代码 ![](https://img.kancloud.cn/04/c9/04c9c60ff8a48c05862047506c669dc5_794x363.png) > 现在的php可以将Opcodes缓存住,从而不必每次执行前3步,除非PHP检测到代码发生了改变。从而很大程度上提高了PHP的执行效率。在php.ini配置文件中可以开启或者关闭Opcodes缓存`opcache.enable=1` ### 指令 Zend虚拟机的指令称为opline,每条指令对应一个opcode.PHP代码在编译后生成opline,Zend虚拟机根据不同的opline完成PHP代码的执行,opline由操作指令,操作数和返回值组成,与机器指令非常类似. opline对应的结构体 ``` struct _zend_op { handler, // 操作执行的函数 op1, // 操作数1 op2, // 操作数2 result, // 返回值 } ```