深入理解PHP内核

Thinking In PHP Internal

第七章 Zend虚拟机

Work In Progress: 本章在编写中

在前面的章节中,我们了解到一个PHP文件在服务器端的执行过程包括以下两个大的过程:

  1. 递给php程序需要执行的文件, php程序完成基本的准备工作后启动PHP及Zend引擎, 加载注册的扩展模块。
  2. 初始化完成后读取脚本文件,Zend引擎对脚本文件进行词法分析,语法分析。然后编译成opcode执行。 如过安装了apc之类的opcode缓存, 编译环节可能会被跳过而直接从缓存中读取opcode执行。

在第二步中,词法分析、语法分析,编译中间代码,执行中间代码等各个部分统称为Zend虚拟机。 与Java、C#等编译型语言相比,PHP少了一个手动编译的过程,它们无需编译即可运行,我们称其为解释性语言。 Java有自己的Java虚拟机,它在多个平台上实现统一语言; C#有自己的.NET虚拟机,它在单一平台实现多种语言; PHP跟他们一样,也有属于自己的Zend虚拟机。它们在本质是相同的,它们都是抽象的计算机。 这些虚拟机都是在某种较底层的语言上抽象出另外一种语言,有自己的指令集,有自己的内存管理体系。 它们最终都会将抽象级别较高的语言实现转化为抽象级别较低的语言实现, 并且实现其它辅助功能,如内存管理,垃圾回收等机制, 以减少程序员在具体实现上的工作,从而可以将更多的时间和精力投入到业务逻辑中。 从抽象层次看,Zend虚拟机比Java等语言更高级一些,这里的高级不是说功能更强大或效率更高, 简单点说,Zend虚拟机离真正的机器实现更远一些。 最近这些年,语言的发展只是不断的抽象,不断的远离机器,没有根本性的变化。

本章,我们从虚拟机的前世今生讲起,叙述Zend虚拟机的实现原理,关键的数据结构, 并在其中穿插一个关于语法实现的示例和源码加密解密的过程说明。