- 这一部分内容主要是编译原理相关的知识,在考试中正规式和传值与传址考察频率较高,表达式偶尔考到,其它内容考察频率较低,所以只是简单介绍一下相关基础知识。
8.1 编译过程
-
在计算机中对于高级语言程序处理一般有两种方式,就是解释和编译。解释是把源程序代码一行一行翻译并执行,翻译与执行一次性完成不产生目标代码,发生在运行时;编译是将整个源程序翻译成可执行的目标代码,翻译与执行是分开的,发生在运行前;其次解释程序可以跨平台,随时修改立即生效,但不可复用,运行效率较低,编译程序相反。下面主要了解的是编译。
-
编译过程
编译分为分析和综合两个阶段,分析阶段包括词法分析,语法分析,语义分析及中间代码生成,综合阶段包括代码优化与目标代码生成。词法分析: 识别出一个个具有独立意义的最下语法单位,即“单词”。
语法分析: 分析句子的语法结构,将一个个单词符号组成语言的各种语法类。类似于分析句子的主谓成分。
语义分析: 分析句子的语义是否正确,比如猴子吃香蕉,香蕉吃猴子就错了。语义分析通常将源程序生成一种中间表示形式,即中间代码。
代码优化: 对中间代码优化,提高目标程序的执行效率。不是编译程序的必要组成部分。
目标代码生成: 将中间代码生成目标机器上的机器代码。
8.2 文法
-
这块内容考试中现在很少考到,所以只简单的讲一下相关的基础知识。
-
定义
-
类型
其中3型文法是我们需要主要了解的。 -
语法推导树
通过语法推导树我们可以知道一种语法能表达的一些串构造的一些句型。终结符一般用小写字母表示,不能单独出现在推导式左边的符号,即不能再进行推导。不是终结符的就是非终结符,一般用大写字母表示。
推导的过程:从开始符号开始,把推出的符号串中的非终结符替换相应规则的右部的符号串,直到符号串为所求的句型。
8.3 有限自动机
-
有限自动机
在状态转换图中,一般标识了S是开始符,双圈代表结束状态,上面的如δ(S, 0) = B表达式就是状态转换函数,每一个式对应状态转换图中的一条路径。考试中一般会给一个状态图,判断能不能识别所给的串。判断的方法就是从起点找到一条到终点的路,路上的输入字符连起来是否为所给的串。
例题:
一步一步推导得到答案是C,先从A开始,输入0到B,输入1到C,输入0到B,输入1到C,所以符合。 -
正规式
其实是对有限自动机的另一种表达形式,下面通过例题看是如何表达的:
| 表示或,可以推出a,也可以推出b;* 表示0个或多个重复。
(1)选D,可以一个一个推导。
(2)选C,可以用代入法,将文法能识别的串代入看是否能够推出,如果能可能就是该文法对应的正规式,但不一定就是正确答案,要进一步分析排除。也可以参考一些常规化的方法。
8.4 程序语言基础——表达式
-
程序语言基础中的重要内容,我们主要了解用树的遍历来求前缀表达式和后缀表达式。中缀表达式就是正常的表达式。
树的前序遍历就是前缀表达式,中序遍历就是中缀表达式,后序遍历就是后缀表达式。考试中一般就是如上图例题中的考察形式,给出中缀表达式求前缀或者后缀表达式,答案选D。如果熟练的话可以直接分析出答案;也可以构造对应的树,构造树时要根据表达式中的运算优先级来构造(所以树中不会出现括号,括号就体现了运算的优先级)。
8.5 函数调用——传值与传址
-
这是考试中经常考察的点,我们在进行函数调用的时候有两种方式,一种是传值,一种是传址,两种方式有不同结果。
-
传值与传址
传值: a的值传给x,b的值传给y,实际是a对应一个存储空间,x对应一个存储空间,传值时相当于把a的值复制给x,两个存储空间都有了3这个值,b也是如此,所以交换完之后,x和y的值交换,a和b的值不变。
传址: a的地址给x,b的地址给y,x和y是两个指针,并没有存具体的值,而是指向了a,b变量的存储空间,当交换x和y对应的值,原来的a和b的值也发生了变化,因为它们对应的是相同的存储空间。