编译型语言
编译是指在应用程序执行前,就将程序源代码「翻译」成汇编语言,然后进一步根据软硬兼环境编译成目标文件。
一般称完成编译工作的工具为编译器。
编译型语言执行流程(以C语言为例):
C语言代码预处理(比如依赖处理,宏替换等)
编译。编译器会把C语言翻译成汇编语言程序。同时会对程序进行优化,生成目标汇编程序。
编译得到的汇编语言通过汇编器再汇编成目标程序。
链接。程序中的一些共享目标文件,如printf()等,位于静态库,需要经过链接器进行链接。
解释型语言
在程序运行时才被「翻译」成机器语言。
执行一次「翻译」一次,所以执行效率较低。
解释器的工作,就是解释型语言中,负责「翻译」源代码的程序。
解释型语言,需要先翻译成中间代码,再经由该解释型语言的特定虚拟机,翻译成特定CPU体系的指令被执行。
PHP7执行步骤
1.源代码首先进行词法分析,将源代码切割为多个字符串单元,分割后的字符串称为Token。
2.独立Token是无法表达完整语意的,需要经过语法分析阶段,将Token转化为抽象语法树(简称AST)
3.之后,抽象语法树被转换为机器指令执行。在PHP中,这些指令称为opcode。
到AST的生成这一步,编译型语言与解释型语言所经历的过程相似。从抽象语法树开始产生差异。
执行PHP简化步骤图
归纳:
1.源码通过词法分析生成Token。
词法分析器使用Re2c实现
2.基于语法分析器生成抽象语法树(AST)。
语法分析器基于Bison实现
语法分析使用了 BNF(Backus-Naur Form 巴科斯范式)来表达文法规则,Bison 借助状态机,状态转移表和压栈、出栈等一系列操作,生成抽象语法树
3.抽象语法树转换为opcodes(opcodes指令合集),PHP解释执行opcodes。
opcode 是 PHP 7 定义的一组指令标识,指令对应着相应的 handler(opcode背后的处理函数)
Token
Token是PHP代码被切割成有意义的标识。
AST
AST 是 PHP 7 版本新特性,PHP 7 对抽象语法树的支持,实现了 PHP 编译器和解释器解耦,有效提升了可维护性。
opcodes
AST 扮演了源码到中间代码的临时存储介质的角色,还需要将其转换为 opcode,才能被引擎直接执行。