第一章概述
(目的:从整体上了解编译的流程 主要是概念)
1.1 程序设计语言与编译程序
概念合集:
编译 :编辑与翻译
翻译程序 :将源程序转换为目标程序的程序,翻译前后的程序在逻辑上是等价的
解释程序:边解释边执行源程序本身,而不产生目标程序的翻译程序
编译程序和解释程序的区别:
- 编译程序是源程序的一个转换系统,解释程序是源程序的一个执行系统(也就是说解释程序最终会有一个代码执行结果)。
- 编译程序是先全部翻译为目标程序在执行,可反复执行(有点像Java的编译执行),解释程序对源程序逐句的翻译执行(Python的执行过程)。
- 解释程序比编译程序更加的通用。
- 通过编译运行,源程序和数据是在不同的时间进行处理的,而解释运行,是同时的。
1.2 编译过程和编译程序的结构
编译的各个阶段:词法分析->语法分析->语义分析->中间代码生成->代码优化->目标代码生成 (如果是问编译程序结构,则在后面都加一个器字,如词法分析器)
各个阶段的任务(重要):
- 词法分析:从左到右扫描输入的源程序,检查词法错误,识别单词,并输出单词的内部表示形式
- 语法分析:在词法分析的基础上将单词组成各类语法短语,并确认整个输入串是否具有语法上正确的程序结构
- 语义分析与中间代码生成:对语义进行检查,如没有错误,则生成中间代码(本书即四元式)
- 代码优化:对产生的中间代码进行等价交换,以产生高质量的目标代码
- 目标代码生成:把中间代码变换成特定机器上的低级语言代码。
一些相关概念:
遍:指把对源程序或其等价的中间表示形式从头到尾扫描并完成规定任务的过程。
源语言:编译程序处理的对象
目标语言与目标机:是编译程序处理的结果和运行环境
编译方法与工具:生成编译程序的关键
第二章 高级语言设计基础
比较重要,需要掌握推导
2.1 高级语言设计基础
基础概念:
字母表:一个高级语言程序能使用的全体字符构成的集合
符号串:指由该字母表中的符号构成的有穷序列
有关运算(有一点重要):
- 长度计算:就是字符个数(空字的长度为0)
- 符号串的连接:即两个字符串拼接在一起,如01,001,连接之后就是01001
- 集合间的乘积:集合U={a}、V={b},a=01,b=001相乘为UV={ab}={01001},注意,乘积满足结合律(UV)M=U(VM),不满足交换律UV!=VU
- 集合的n次方幂:自身的n次乘积,0次方为{空字}
- 闭包和正闭包:A的闭包(表示A上的一切符号串(包括ε)组成的集合)=
正闭包 = AA的闭包
注:A中任意一个按一定规则构成的子集称为A上的一个语言
例:
UV={aa00,aa11,bb00,bb11}
V*={ε,0,1,00,01,10,11,000,010,100,110,001,011,101,111,…}
重要概念:
上下文无关文法(文法):是描述语言的语法结构的形式规则,这些规则必须准确且可理解。是一个四元组,文法G=(V(N),V(T),P,S),V(N)是非终结符集,V(T)是终结符集,S是开始符号,P是产生式集合
推导:将一个符号串(通常是从开始符开始)里的非终结符用产生式右部进行替换和展开,直到全为终结符为止。
推导分为最左推导(每一步都是将最左边的非终结符替换为终结符为止)和最右推导
规约:推导的逆过程
句型:从开始符号出发推导的符号串称为文法G的一个句型
句子:若句型里的符号全为终结符,则称为句子
相关计算:
例:
(1)是最左推导。(2)是最右推导
可能还要画语法树:语法树就是将每一步推导画成树的形式,画出来之后可以通过叶结点按照从左到右的顺序排列,如果结果是最终推导的结果来检查有没有画对
文法定义的语言:
2.2.3 文法的二义性
语法树:用一颗树的形式来表示句型的推导
二义文法:某个文法存在某个句型对应两棵或者两棵以上的语法树,称为二义文法(注:文法的二义性并不代表语言一定是二义的,只有产生一个语言的所有的文法都是二义性的,这个语言才是二义的(因为不同文法可以产生同一种语言))
一个程序设计语言是一个记号系统。如同自然语言一样,每种高级语言都由语法、语义和语用3个方面来定义。
- 语法是定义程序构成的一组形式规则。
- 语义是一组规则的集合,用以定义程序的含义。
- 语用主要是有关程序设计技术和语言成分的使用方法