编译型语言
    编译是指在应用程序执行前,就将程序源代码「翻译」成汇编语言,然后进一步根据软硬兼环境编译成目标文件。
    一般称完成编译工作的工具为编译器。
    编译型语言执行流程(以C语言为例):
    C语言代码预处理(比如依赖处理,宏替换等)
    编译。编译器会把C语言翻译成汇编语言程序。同时会对程序进行优化,生成目标汇编程序。
    编译得到的汇编语言通过汇编器再汇编成目标程序。
    链接。程序中的一些共享目标文件,如printf()等,位于静态库,需要经过链接器进行链接。
    image.png

    解释型语言
    在程序运行时才被「翻译」成机器语言。
    执行一次「翻译」一次,所以执行效率较低。
    解释器的工作,就是解释型语言中,负责「翻译」源代码的程序。
    解释型语言,需要先翻译成中间代码,再经由该解释型语言的特定虚拟机,翻译成特定CPU体系的指令被执行。
    PHP7执行步骤
    1.源代码首先进行词法分析,将源代码切割为多个字符串单元,分割后的字符串称为Token。
    2.独立Token是无法表达完整语意的,需要经过语法分析阶段,将Token转化为抽象语法树(简称AST)
    3.之后,抽象语法树被转换为机器指令执行。在PHP中,这些指令称为opcode。
    到AST的生成这一步,编译型语言与解释型语言所经历的过程相似。从抽象语法树开始产生差异。
    执行PHP简化步骤图
    image.png
    归纳:
    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,才能被引擎直接执行。