探索编译原理之序章

1.前言

最近在写源码精读系列,第一个系列是阅读PHP的源码。总得来说,有一个体会,编译原理是核心的技术。于是,本着侯杰先生(深入浅出MFC)的“勿在浮沙筑高台”编程理念。我决定,再写一个编译原理相关的理论文章,给大家学习编译原理打下坚实的理论基础。编译原理的参考资料是清华大学张素琴 吕映芝写的《编译原理》教材。

2.编译原理的市场

首先,编译原理适用于高性能的编程语言,这里的高性能是指与底层CPU指令集的亲缘性程度。目前,市面上编译原理的衍生物有很多,不夸张的讲,只要涉及到中间代码翻译的,就会涉及到编译原理的知识要点。中间代码,意味着是一个中间件的概念,你也可以理解为一座桥梁,桥梁是两个不沾边的地方互通的渠道之一。比如:中间件mycat,或者跨平台的前端编译框架HBuilder,又或是不同语言的翻译器、AI的语言识别等等。

3.编译过程有哪些阶段

传统的编译流程如下图所示:

3.1 法分析

词法分析,通过对源程序从左到右的字符流扫描和分解,来识别目标单词或者符号,即Token。

3.2 语法分析

语法分析,是拿到词法分析阶段识别的Token,转化成语法树。比如$a = 1 + 1;转化为如下语法树:

语法树

3.3 语义分析

语义分析阶段,是检测源程序是否符合语义的规则。通过对语法树插入语义分析的节点,来进行语义的检测,上面的过程,进行语义分析检测后,会变成如下所示:

语义分析判断树

通过语义分析节点的插入,来判断语法树是否符合语义的规则。

3.4 中间代码生成

中间代码生成阶段,将词法分析和语法分析后的结果转成符号系统,一般用四元式表示,比如:(运算符、运算对象1、运算对象2、结果)。上面的语义分析树将生成如下四元式:

(is_integer, 1, 无(左节点无数据), 临时变量1)

(+, 1, 临时变量1,临时变量2)

(=, $a, 临时变量2,最后结果3)

3.5 代码优化

代码优化阶段,将中间代码生成的符号系统进行优化,上面的例子并没有需要太多优化的,假如式$a = 1 + 2 * 3 ,则会优化为 $ a = 1 + 6 的形式。

3.5 目标代码生成

目标代码生成阶段,是将代码优化阶段生成的指令转化成目标指令。

4.编译系统与解释系统

上述的流程,我们介绍的是编译系统。而一些解释系统,比如:PHP的解释器。它并没有中间代码生成的环节,取而代之的是,直接调用高级语言来执行解释结果。

5.编译原理的辅助工具

yacc+lex是一个很好的初学者去应用理解编译原理过程的辅助工具,具体的介绍,请看这里

6.参考

清华大学 《编译原理》张素琴 吕映芝

如无特殊说明,文章均为本站原创,转载请注明出处。如发现有什么不对的地方,希望得到您的指点。

发表评论

电子邮件地址不会被公开。 必填项已用*标注