1.什么是编译程序
翻译程序/翻译器:它读入用某种语言编写的程序(源程序),翻译成一个与之等价的另一种语言编写的程序(目标程序),这两种语言分别称为源语言和目标语言。
编译程序/编译器:源语言类似Pascal或C那样的高级语言,目标语言是像汇编语言或机器语言那样的低级语言,则这种翻译程序称做编译程序。
解释程序/解释器:它以该语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序本身。
编译程序和解释程序的区别:
- 二者本质区别在于是否生成目标代码
- 编译型代表:C&C++ C# Java 解释型代表:Shell,JavaScript,SQL
- 编译型语言的源代码有错误编译不通过,无法生成课执行代码,更无法执行程序
- 解释型语言只有执行时才会判断是否出错,即使一句出错,也可以继续执行下一句
- 编译型语言执行效率上大大由于解释器
2.编译过程和编译程序的结构
2.1词法分析
这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词,又称扫描器。
单词符号:基本字,标识符,常数,算符和界符
词法规则用正规式和有限自动机描述(第三章)
2.2语法分析
- 单词符号串→语法单位
- 语法分析所依据的是语言的语法规则,即描述程序结构的规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。语法规则用上下无关文法描述(第4,5,6章)
- 语法单位:短语,句柄,句子,程序段和程序
- 程序的结构通常是由递归规则表示的,可以用如下的规则来定义表达式:
- 任何标识符是表达式
- 任何常数(整常数、实常数)是表达式
- 若表达式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)在数中出现非数字字符——词法分析