编程语言的虚拟机是一种可以运行中间语言的程序。中间语言是抽象出的指令集,由原生语言编译而成,作为虚拟机执行阶段的输入。
PHP7完成基本的准备工作后,会启动Zend引擎,加载注册的扩展模块,然后读取对应的脚本文件,Zend引擎会对文件进行词法和语法分析,生成AST,接着AST被编译成opcode,如果开启了opcache,编译的环节会被跳过从opcache中直接读取,opcode进行执行。
11.1.1 基础知识
Zend虚拟机(成为Zend VM)是PHP语言的核心。
1.解释层
这一层主要对PHP代码进行词法和语法分析,生成对应的AST;另一个工作就是对AST进行编译,生成符号表和指令集。
2.中间数据层
这一层包含了虚拟机的核心部分-执行栈的维护、指令集和符号表的存储,而这些是执行引擎调度执行的基础。
3.执行层
这一层是执行指令层的引擎,负责最终的执行并生成结果,这一层实现了大量的底层函数。
11.1.2 符号表
符号表是编译程序在编译过程中用来记录源程序中各种名字的特征信息,所以也成为名字特征表。
符号表作用:
1.协助进行语义检查
2.协助中间代码生成
符号表一般有三种构造和处理方法:
线性查找
二叉树
hash技术,PHP7符号表就是通过HashTable实现的
11.1.3 函数调用栈
11.1.4 指令