一、什么叫编译程序:
- 编译程序是系统软件中发展最早的成员之一,基础理论发展很成熟。但是新的编程语言发展很快,编译理论也需要向前发展;
- 编译理论和其它课程关系:基础是自动机和形式语言,素材有离散数学、数据结构,上层是操作系统。
- 编译理论的应用:许多想法和技术用于一般软件设计。
- 翻译程序:输入某种语言的一系列语句,输出另一种语言的一系列语句。编译程序是它的子集。
- 编译程序:用高级语言写的源程序作为数据接收,经过翻译转换产生面向机器的代码作为输出。可能还涉及汇编。
二、编译过程概述:
1.编译过程(先大致):
老师上课过程中,是和英语文章翻译过程来类比一下:
- 断词(词性,本身是什么意思):要知道断词的规则,比如英语中用逗号分开,用空格分开等等,那高级语言里面比如for,if,我们不能说f,或者o来断开。那英语的词断了之后,查字典,查这个词对吗,错的话字典查不到,对的话,那我们看到这个词的性质,它是动词还是名词还是其它词性,那放在高级语言里面,比如我们看到for,查出来是个定义符还是个标志符,还有它的意思。接下来,继续查,查完了整篇文章的词,类比过来就是高级语言里面所有其它部分if啊 k啊 i啊 等等全部查到了。查好之后知道了这个词什么性质,这个词叫什么名字。进入第二阶段。
- 分析句子:那么词都查对了,根据英语语法规则分析句子,分析段,分析文章对不对。高级语言像英语一样也有语法规则,需要根据他分析句子。分析完这块,至少保证形式上这篇英语文章是对的,那对应的,我们的程序在形式是正确的了。
- 理解含义:语法角度没有问题之后,那接下来就关心这句话什么意思,进行差不多的理解,草译一下。
- 修饰:由于草草翻译,那我们发现,这个人英语水平怎么这么烂,啰里啰嗦,找个高手来修饰一下,但是要忠实于原文。对应程序,我们要和原来程序的逻辑、功能保持一致,反复的优化。
- 成文:最后交差。
以上五个通俗过程的类比,对应下面:

下面分开来详解:
2.词法分析:

举个例子,从头到尾一个个扫描,得到了如下结果:

比如:他看到的是“F""O""R",它扫过之后,发现这是个for,是个定义符,(而不是NEXT,而不是运算符)。
3.语法分析:

关心三件事情:第一,每一段每个过程入口是什么;第二,每个过程产生了什么;第三,中间怎么折腾的。
词法分析的结果是语法分析的入口,词法分析得到的单词串转化为语法单位。
语法单位(语法范畴)的引入是为了层次化表达程序和单词的关系。单词构成句子,句子构成程序段,程序段构成程序。我们不能说程序由单词构成,这样显得太粗糙,无法学习,引入语法单位使得程序的表述更有层次,我们知道单词怎么写,句子怎么写,程序段怎么写,那么最后也就知道了程序怎么写。后面慢慢体会。
最后确定了整个输入串是否语法正确,也就是形式上是不是正确。比如人上大学。大学上人。这两个句子从传统意义上讲,后面那个应该是不对的,但从语法角度看,主谓宾都齐全,形式上首先是正确的。
示例如下:
语法分析首先看到了词法分析的结果(只是形式上用这样的块表示一下方便理解):

他不会去问f是什么,o是什么,r是什么了,因为词法分析结果已经出来了,不用再“查字典了 ”。而是根据语言的规则,进行语法分析,下面一步步来看:
下面的规则,它知道什么地方是表达式:

就把输入串中符合这条规则的看成表达式,成这样了:

根据:

又把符合赋值句条件的串,得到了:

然后又有这样的规则:

于是乎,中间两个赋值句就合并为了语句块:

对于循环,有这样的规则:

那么进一步分析,把To两侧的表达式就分析的更清楚:

根据规则:

又明确了K:

最后,得到一个高度形式化的循环语句。结果和FOR规定的语法规则是一样的,符合定义:

需要重点说明的是,我们上面的举例只是为了便于理解,实际的语法分析过程是扫描,也就是碰到什么就立刻分析,而不是说找出所有的表达式,找出所有的语句块等等。我们上面这样讲解只是为了便于理解和分析。
上面两个部分是死的,标志符怎么定义(字符数字串),字母怎么定义,数字串又是什么,哪个词是什么意思。比如上面他看到F是个字母,O是个字母,R是个字母,然后扫到空格了,然后查了一下表,发现哦,这原来是个FOR标志符。那赋值语句呢(在这个课举的这个语言的例子),首先看到个标志符,然后是等号,然后往后扫是个表达式,最后面一个间隔。查一下表,哦,原来这是个赋值语句。其他运算符,界符,数字都是同理的,这都是有规矩可循的,是完全形式化的,长什么样子就是什么,不符合规则,那就不是,就错了。
下面就要开始理解含义了,到了语义分析,中间代码生成环节。
4.中间代码生成:

识别各种语法范畴,就是说看出这是个子句,是个子句,是个程序段等、然后初步翻译。
中间代码是用另一种语言来表述。中间代码中也有一些规矩可以形式化的。比如看到for之后知道这是个循环语句,对循环语句做翻译时候,有一些规则,利用这些规则指导翻译的进行。比如有个for出来,就一定会有个next,他看到for之后,会往下去找这个next,找到这个next之后,然后就知道了这中间一大段就是循环语句:


注意同一个控制变量,for到next是一个循环块,如果还有i,还有j就有情况了。


识别并理解了这个循环块之后,然后生成四元式(就是个草稿),这些概念后面会着重讲解,此处只是引论知道即可:


然后为了方便起见,一一对应,好看一点并且便于讲解。我们把四元式重写成另一种形式的中间代码:

源程序->四元式
到这里就完成了草译了,接下来要修饰一下,进行一番优化。