深入理解PHP内核

Thinking In PHP Internal

第二节 语法的实现

世上没有无缘无故的爱,也没有无缘无故的恨。

语言从广义上来讲是人们进行沟通交流的各种表达符号。每种语言都有专属于自己的符号,表达方式和规则。 就编程语言来说,它也是由特定的符号,特定的表达方式和规则组成。 语言的作用是沟通,不管是自然语言,还是编程语言,它们的区别在于自然语言是人与人之间沟通的工具, 而编程语言是人与机器之间的沟通渠道。相对于自然语言,编程语言的历史还非常短, 虽然编程语言是站在历史巨人的基础上创建的,但是它还很小,还是一个小孩。 它只能按编程人员所给的指令翻译成对应的机器可以识别的语言。它就相当于一个转化工具, 将人们的知识或者业务逻辑转化成机器码(机器的语言),让其执行对应的的操作。 而这些指令是一些规则,一些约定,这些规则约定都是由编程语言来处理。

就PHP语言来说,它也是一组符合一定规则的约定的指令。 在编程人员将自己的想法以PHP语言实现后,通过PHP的虚拟机将这些PHP指令转变成C语言 (可以理解为更底层的一种指令集)指令,而C语言又会转变成汇编语言, 最后汇编语言将根据处理器的规则转变成机器码执行。这是一个更高层次抽象的不断具体化,不断细化的过程。

在这一章,我们讨论PHP虚拟机是如何将PHP语言转化成C语言。 从一种语言到另一种语言的转化称之为编译,这两种语言分别可以称之为源语言和目标语言。 这种编译过程通常发生在目标语言比源语言更低级(或者说更底层)。 语言转化的编译过程是由编译器来完成, 编译器通常被分为一系列的过程:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等。 前面几个阶段(词法分析、语法分析和语义分析)的作用是分析源程序,我们可以称之为编译器的前端。 后面的几个阶段(中间代码生成、代码优化和目标代码生成)的作用是构造目标程序,我们可以称之为编译器的后端。 一种语言被称为编译类语言,一般是由于在程序执行之前有一个翻译的过程, 其中关键点是有一个形式上完全不同的等价程序生成。 而PHP之所以被称为解释类语言,就是因为并没有这样的一个程序生成, 它生成的是中间代码,这只是PHP的一种内部数据结构。

在本章我们会介绍PHP编译器的前端的两个阶段,词法分析、语法分析;后端的一个阶段,中间代码生成。 在第一节我们介绍PHP的词法分析过程及其用到的工具re2c, 第二节我们介绍在词法分析后的语法分析过程, 第三节我们以PHP的一个简单语法实现作为本章的结束。