高级语言根据运行方式的不同大致分为两种:编译型和解释型。编译是指在应用程序源程序执行前,先将程序源代码“翻译”成汇编语言,再根据软硬件环境进一步编译成目标文件。完成编译工作的工具一般称为编译器。当程序运行时,解释语言被“翻译”成机器语言。但是,“翻译”只进行一次,执行效率低。解释器的工作是负责用解释性语言“翻译”源代码的程序。编译类型#include(stdio.h)>intmain(){printf("helloword");返回1;}编译执行过程如图所示。第一步:C语言代码预处理(如依赖处理、宏替换等)。如上面的代码示例,#inlcude将在预处理阶段被替换。第二步:编译。编译器会将C语言翻译成汇编语言程序,一段C语言通常会编译成多段汇编代码。同时,编译器会对程序进行优化,生成目标汇编程序。第三步:编译后的汇编语言再通过汇编器编译成目标程序hello.o。第4步:链接。程序中往往包含一些共享对象文件,如示例程序中的printf()函数,位于静态库中,需要通过链接器(如Uinxconnectorld)进行链接。对于编译型语言,代码更新必须经过上述步骤。理解编译型语言和解释型语言的区别,是根据源代码编译成目标平台的CPU指令的时机。对于编译型语言,编译后的结果已经是当前CPU系统的一条指令;对于解释型语言,需要先编译成中间代码,再通过解释型语言的特定虚拟机翻译成特定CPU系统的指令执行。解释性语言是在运行时被翻译成目标平台的指令。人们常说解释型语言“慢”,主要是这里慢。PHP7在PHP7中,首先对源码进行词法分析,将源码分割成多个字符串单元,分割后的字符串称为Token。但是单个的Token并不能表达完整的语义,需要经过句法分析阶段,将Token转化为抽象语法树(AbstractSyntaxTrees,简称AST)。之后,将抽象语法树转化为机器指令执行。在PHP中,这些指令称为操作码。直到生成AST这一步,编译型语言和解释型语言需要经历的过程是相似的。差异始于抽象语法树之后。PHP7执行过程的第1步:词法分析将PHP代码转换成有意义的标识Token。这一步的词法分析器是使用Re2c实现的。Step2:语法分析从Token和符合语法规则的代码生成抽象语法树。解析器是基于Bison实现的。文法分析使用BNF(Backus-NaurForm)来表达文法规则,Bison借助状态机、状态转换表以及入栈出栈等一系列操作生成抽象语法树。第三步:上一步的抽象语法树生成相应的操作码,由虚拟机执行。opcode是PHP7定义的一组指令标识,指令对应相应的handler(处理函数)。当虚拟机调用opcode时,会找到opcode背后的处理函数,进行真正的处理。TokenToken是PHP代码切入的一个有意义的标识。它是一个接一个的“词块”,但单个词块不能表达完整的语义,需要借助规则进行组织和连接。解析器就是这个组织者。它检查语法、匹配标记并关联标记。在PHP7中,组织级联的产物是AST(AbstractSyntaxTree,抽象语法树)。ASTAST是PHP7版本的新特性。在以前的版本中,PHP代码执行过程中没有生成AST的步骤。PHP7对抽象语法树的支持,实现了PHP编译器和解释器的解耦,有效提高了可维护性。顾名思义,抽象语法树具有树状结构。AST节点分为多种类型,对应PHP语法。可以认为节点类型是对语法规则的抽象,比如赋值语句,生成的抽象语法树节点为ZEND_AST_ASSIGN。赋值语句的左右操作数将是ZEND_AST_ASSIGN类型节点的子节点。通过这样的节点关系,构建了一个抽象语法树。opcodesAST起到从源代??码到中间代码的临时存储介质的作用,需要先转换成opcode才能被引擎直接执行。opcode只是一条指令,opcodes是opcodes的集合,是PHP执行过程中的中间代码,类似于Java中的字节码。操作码生成后,由虚拟机执行。在PHP的性能优化措施中,有一个比较常见的“开启opcache”,这里指的是操作码缓存(opcodescache)。通过取消从源代码到操作码的阶段,引擎可以直接执行缓存的操作码,从而提高性能。