编译原理(王生源第三版)第一章学习笔记(含第一章习题)

1.什么是编译程序

翻译程序/翻译器:它读入用某种语言编写的程序(源程序),翻译成一个与之等价的另一种语言编写的程序(目标程序),这两种语言分别称为源语言和目标语言。

编译程序/编译器:源语言类似Pascal或C那样的高级语言,目标语言是像汇编语言或机器语言那样的低级语言,则这种翻译程序称做编译程序。

解释程序/解释器:它以该语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序本身。

编译程序和解释程序的区别:

  • 二者本质区别在于是否生成目标代码
  • 编译型代表:C&C++ C# Java    解释型代表:Shell,JavaScript,SQL
  • 编译型语言的源代码有错误编译不通过,无法生成课执行代码,更无法执行程序
  • 解释型语言只有执行时才会判断是否出错,即使一句出错,也可以继续执行下一句
  • 编译型语言执行效率上大大由于解释器

2.编译过程和编译程序的结构

 2.1词法分析

这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词,又称扫描器。

单词符号:基本字,标识符,常数,算符和界符

词法规则用正规式和有限自动机描述(第三章)

2.2语法分析

  • 单词符号串→语法单位
  • 语法分析所依据的是语言的语法规则,即描述程序结构的规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。语法规则用上下无关文法描述(第4,5,6章)
  • 语法单位:短语,句柄,句子,程序段和程序
  • 程序的结构通常是由递归规则表示的,可以用如下的规则来定义表达式:
  1. 任何标识符是表达式
  2. 任何常数(整常数、实常数)是表达式
  3. 若表达式1和表达式2都是表达式,那么:表达式1+表达式2   表达式1*表达式2                 (表达式1)都是表达式 类似地,语句也可以递归地定义,如(1)标识符 :=表达式 是语句。(2)while(表达式)do 语句和if(表达式)then 语句 else语句都是语句

2.3语义分析

语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。

语义检查:变量是否定义,类型是否正确(第7,8章部分内容)

按照语义规则对语法分析器归约出的语法单位进行语义分析,并把它们翻译成一定形式的中间代码。

2.4中间代码生成

所谓中间代码是一种结构简单,含义明确的记号系统,这种记号系统可以设计为多种多样的形式,重要的设计原则为两点,一是容易生成,而是容易将它翻译成目标代码。

四元式中间代码(第7,8章):

形式为(运算符,运算对象1,运算对象2,结果)

2.5代码优化

这一阶段的任务是对前一阶段产生的中间代码进行变换或进行改造,目的是使生成的目标代码更为高效,即省时间和省空间。

对中间代码进行优化处理(第10章)

2.6目标代码生成

这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。(第10章)

2.7“遍”的概念

编译程序通常被组成若干遍。所谓遍就是对源程序或源程序的中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序

2.8表格管理程序和出错处理程序

表格管理:符号表管理

用来登记源程序中出现的每个名字及其属性,如常量名,变量名,过程名等

如果是变量名,其属性有类型、内存大小、地址等(第8章)

出错处理:用来发现程序中的错误

程序中的错误分为语法错误和语义错误

语法错误在词法分析(非法字符)和语法分析(括号不匹配)时检测

语义错误在语义分析时检测(类型错误)

2.9编译前端和后端

前端相同,后端不同,在不同的目标机器上运行相同的语言

前端不同,后端相同,在不同的语言编译成相同的中间语言

3.解释程序和一些软件工具

集成开发环境

编译程在高级诧言发展的早期,这些程序设计工具往往是独立的,缺乏整体性,而丏也缺乏对软件开发全生命周期的支持。随着软件技术的不断发展,现在人们越来越倾向于构造集成化的软件开发环境 (IDE, IntegratedDevelopment Environment) 。一个集成化的程序设计环境的特点是,它将相互独立的程序设计工具集成起来,以便为程序员提供完整的、一体化的支持,从而迚一步提高程序开发效率,改善程序质量。

4.课后习题:

1.解释下列术语

编译程序:将源语言是像FORTRAN/Pascal或C那样的高级语言翻译成与之等价的类似汇编语言或机器语言那样低级语言,这样的翻译程序称作编译程序。

源程序:是指未经编译过的,按照一定的程序设计语言规范书写的,人类可读的文本文件。

目标程序:目标程序:指源程序经编译可直接被计算机运行的机器码集合(二进制代码)

编译程序的前端:主要依赖于源语言和目标机无关。

编译程序的后端:与源语言无关,与目标机有关,依赖于中间代码

2.编译程序有哪些主要构成部分?各自主要的功能是什么?

6个阶段:

词法分析:这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词,又称扫描器。

语法分析:是在词法分析的基础上将单词序列分解成各类语法短语,如“程序”、“语句”、“表达式”等。

语义分析:审查源程序有无语义错误,为代码生成阶段收集类型信息

中间代码生成:所谓中间代码是一种结构简单,含义明确的记号系统,这种记号系统可以设计为多种多样的形式,重要的设计原则为两点,一是容易生成,而是容易将它翻译成目标代码。

代码优化:这一阶段的任务是对前一阶段产生的中间代码进行变换或进行改造,目的是使生成的目标代码更为高效,即省时间和省空间。

目标代码生成:这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。

3.什么是解释程序?它与编译程序的主要不同是什么?

解释程序:它以该语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序本身。

编译程序和解释程序的区别:二者本质区别在于是否生成目标代码

4..对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、代码生成)报告的。

(1)else没有匹配的if——语法分析

  (2)数组的下标越界——语义分析

(3)使用的函数没有定义——语义分析

(4)在数中出现非数字字符——词法分析

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1解:源程序是指以某种程序设计语言所编写的程序。目标程序是指编译程序(或解释程序)将源程序处理加工而得的另一种语言(目标语言)的程序。翻译程序是将某种语言翻译成另一种语言的程序的统称。编译程序与解释程序均为翻译程序,但二者工作方法不同。解释程序的特点是并不先将高级语言程序全部翻译成机器代码,而是每读入一条高级语言程序语句,就用解释程序将其翻译成一段机器指令并执行之,然后再读入下一条语句继续进行解释、执行,如此反复。即边解释边执行,翻译所得的指令序列并不保存。编译程序的特点是先将高级语言程序翻译成机器语言程序,将其保存到指定的空间中,在用户需要时再执行之。即先翻译、后执行。 2解:一般说来,编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。 3解:C语言的关键字有:auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while。上述关键字在C语言中均为保留字。 4解:C语言中括号有三种:{},[],()。其中,{}用于语句括号;[]用于数组;()用于函数(定义与调用)及表达式运算(改变运算顺序)。C语言中无END关键字。逗号在C语言中被视为分隔符和运算符,作为优先级最低的运算符,运算结果为逗号表达式最右侧子表达式的值(如:(a,b,c,d)的值为d)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值