一.解释行语言也需要编译
二.PHP的主要模块
- 首先是Application,就是我们的上层应用——平时写的PHP程序,可以是web应用或者php脚本;
- 接着是SAPI(Server Application Programming Interface),服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,并且通过
sapi成功的将php本身和上层应用解耦隔离
,php可以不再考虑如何针对不同的应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式; - 再下来是Extensions——扩展层,围绕着Zend引擎,扩展层通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过扩展来实现,我们自己也能自定义一些扩展来达到扩展功能、优化性能等目的;
- 最下面就是Zend了,整体用纯c实现,是php的内核部分,在这一层,
它将php代码翻译成opcode并提供相应的处理方法、实现了基本的数据结构、内存分配及管理、提供了相应的api方法工外部调用,时一切的核心,所有的外围功能均围绕zend实现。
三.词法解析
3.1 词法分析
词法分析作用:
- 最重要的考虑是简化编译器设计。
- 提高编译器效率(因为能专精)。
- 增强编译器的可移植性。
3.2 NFA-不确定有穷自动机
正则表达式的规则很容易理解,但是正则表达式并不能直接用来解析字符串。有穷自动机首先包含一个有限状态的集合,还包含了从一个状态到另外一个状态的转换。有穷自动机看上去就像是一个有向图,其中状态是图的节点,而状态转换则是图的边。此外这些状态中还必须有一个初始状态和至少一个接受状态。
- 结点代表状态,用圆圈表示。
- 状态之间用箭头连结,代表一个状态向另一个状态的转换。
3.3 DFA-确定有穷自动机
四.抽象语法树-AST
语法解析的过程:
$a = 1;