Skip to content

Latest commit

 

History

History
20 lines (13 loc) · 2.77 KB

1.2.md

File metadata and controls

20 lines (13 loc) · 2.77 KB

1.2 zend引擎是如何工作的:操作码(Opcodes)和执行过程(op Arrays)

zend引擎执行一个脚本会经过一下几个步骤: 1、脚本经过语法解析器(lexer)把可读的代码转成机器可读的符号(tokens)。这些符号(tokens)然后被传给解析器。 2、解析器解析经过语法解析器解析生成的符号流(stream of tokens),生成可以在zend引擎上运行的指令。zend引擎是一个生成装配式,三指定地址代码并且执行的它的虚拟机。很多解析器生成一个抽象语法树或者解析树,可以在传给代码生成器之前操作或优化。zend引擎把这些步骤合并到了一起,直接把经过语法解析器生成的符号转成中间码。 # 虚拟机是什么?

		zend引擎是一个虚拟机(vm),就是一个软件模拟真实的计算机。像java,它的虚拟机结构提供了可移植性,你可以把编译后的代码从一个计算机移植到另一台计算机。Zend引擎不知情预编译。zend引擎为PHP提供了灵活性。
		相比之下,x86系列处理器只能处理75种基本指令(用来驱动你的计算机),zend引擎可以执行约150条基本指令(用Zend语言叫opcodes)。这些指令集不仅包括典型的虚拟机的逻辑和数学操作,还包括复杂的指令,像include(单独的zend引擎指令)和打印字符串(也是单独的一个指令)。

		虚拟机一般没有它所运行在的物理机快,所以可以通过把复杂的指令作为一个单独的指令执行来提高执行速度。这一般被称为一个复杂的指令集计算机(CISC)架构,与此相反的是精简指令的计算机(RISC),这种计算机只有一个小的指令集并且可以极快的执行这下指令。
		#

	从PHP扩展或嵌入式的开发者角度来看,这个功能实现在一个阶段:编译。编译需要一个脚本并且生成中间代码。这些中间代码(或多或少)是与机器无关的,可以被认为是zend引擎的“汇编代码”。

	这些中间代码是一个有序数组(an op array——short for operations array)的命令集(被称为opcodes——operation code 的简称),这些命令集都是基本地三地址代码:两个操作说是输入,第三个操作数存放结果,加上将处理操作数的处理程序。操作数即可以是一个常量(静态值)或是一个临时变量,实际上是zend引擎上的一个寄存器。最简单的情况下,操作码操作两个输入的操作数并且把结果存储在一个结果操作数中。在复杂的情况下,操作码也可以控制流程,重置执行顺序实现根据条件进行循环。
3、中间代码被生成之后,被传给执行器,执行器按顺序依次执行。