学习总结:这一部分是编译原理的绪论部分内容,对编译程序的整体框架流程进行了介绍。内容均为概念,没有能够出大题的内容,个人认为考试前只需要对这些概念有一个基本的了解即可,而非将本章作为复习重点。
1.什么是编译程序
编译程序的地位:
- 编译程序是现代计算机系统的基本组成部分之一;
- 多数计算机都配有不止一种高级语言编译程序,对有些高级语言甚至配置了几个不同性能的编译程序。
编译程序的功能:从功能上看,一个编译程序就是一个语言翻译程序,把一种语言(源语言)书写的程序翻译成另一种语言(目标语言)的等价程序。但是其中的源语言是高级语言,目标语言是低级语言。
编译程序的重要性:编译程序使得多数计算机用户不必考虑与机器有关的繁琐细节,使得程序员独立于机器。
程序设计语言处理程序的典型流程:编译程序是程序设计语言处理程序的一部分。
- 预处理程序:一个源程序可能分成几个模块存放在不同的文件里,由预处理程序来将这些源程序汇集在一起。有些预处理程序也负责宏展开(如C语言的预处理程序)。
- 过程概述:编译程序生成的目标程序是汇编代码的形式,需要经过汇编程序翻译成可再装配(或可重定位)的机器代码,再经由装配/连接编辑程序与某些库程序连接成可以在机器上运行的代码。
2.编译过程和编译程序的结构
2.1.编译过程概述
编译过程的典型划分方法:
-
词法分析:
- 词法分析是编译过程的第一个阶段;
- 词法分析阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词,例如标识符和保留字等。
-
语法分析:
- 语法分析是编译过程的第二个阶段;
- 语法分析阶段的任务是在词法分析的基础上将单词序列分解为各种语法短语,例如程序、语句和表达式等。通过语法分析确定整个输入串是否构成语法上正确的程序。
- 可以将语法分析的结果表示为语法树的形式。
-
语义分析:
- 语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。
- 语义分析的具体任务包括类型审查、下标检查和运算对象的类型转换等。
-
中间代码生成:
- 在进行完语法分析和语义分析后,有的编译程序将源程序变为一种内部表示形式,这种内部表示形式被称为中间语言或中间代码。
- 中间代码是一种结构简单、含义明确的记号系统,需要满足两点设计原则:一是容易生成,二是容易将它翻译成目标代码。
- 很多编译程序采用一种类似于三地址指令的“四元式”中间代码,可以表示为
(运算符,运算对象1,运算对象2,结果)
。
-
代码优化:代码优化阶段的任务是对前一个阶段产生的中间代码进行变换或改造,目的是使得生成的目标代码更加高效,也就是更加节约时间和空间。
-
目标代码生成:
- 目标代码生成阶段的任务是把中间代码变换为特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。
- 这是编译的最后阶段,它的工作和硬件结构和指令含义等都有关,是一个非常复杂的过程。
备注:并非所有的编译程序都划分为这样几个阶段,有些编译程序并不需要生成中间代码,有些编译程序不进行优化。不过大多数编译程序都包含上述几个工作阶段。
2.2.编译程序的结构
编译程序的组成:
- 编译过程的六个阶段可以分别由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序和目标代码生成程序六个模块完成。
- 此外,一个完整的编译程序还必须包括表格管理程序和出错处理程序。
- 表格管理程序:编译过程中源程序的各种信息被保留在不同的表格中,编译各阶段的工作都涉及构造、查找和更新有关的表格,因此需要有表格管理的工作。
- 出错处理程序:如果在编译过程中发现源程序有错误,编译程序应该报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能够继续被编译下去,有些编译器还能自动校正错误,这些工作由出错处理程序完成。
2.3.编译阶段的组合
编译过程前端和后端的划分:有时候把编译过程分为前端和后端。
- 编译前端:前端的工作主要依赖于源语言,而与目标语言无关。一般包括词法分析、语法分析、语义分析和中间代码生成这些阶段,以及某些优化工作。
- 编译后端:后端是指那些依赖于目标机而一般不依赖于源语言,只与中间代码有关的那些阶段的工作,包括目标代码生成,以及相关出错处理和符号表操作。
- 前端和后端的组合:某一个编译程序的前端加上相应的后端可以为不同的机器构成同一个源语言的编译程序;不同语言编译的前端生成同一种中间语言,再使用一个共同的后端,则可以为同一个机器生成几个语言的编译程序。
编译过程的遍数:
- 一个编译过程可以由一遍、两遍或多遍完成。
- 遍,是指对源程序或其等价的中间语言程序从头到尾扫描并完成规定任务的过程,每一遍扫描可以完成上述一个阶段或多个阶段的工作。
- 一个多遍的编译程序可以比一遍的编译程序少占内存,整个编译程序的逻辑结构也更加清晰;但是多遍也意味着增加读写中间文件的次数,消耗更多的时间。
3.解释程序和一些软件工具
3.1.解释程序
编译程序的问题:如果不把整个程序全部翻译完成之后,这个程序不能开始运行,也不会产生任何结果。
解释程序概述:解释程序接受某个语言的程序并立即运行这个程序。它的工作模式就是一个个的获取、分析并执行源程序语句,一旦一条语句分析阶数,源程序便开始运行并生成结果。解释程序允许执行时修改程序。
编译程序和解释程序的存储组织比较:
- 编译程序的存储组织:在源程序被编译的阶段,存储区中要为源文件和目标代码开辟空间,要存放编译用的各种表格。在目标代码运行阶段,存储区中主要是目标代码和数据,编译所用的信息就都不再需要了。
- 解释程序的存储组织:解释程序一般对源程序的每一个语句逐一进行语法分析,转换为一种内部表示形式,存放在源程序区。由于解释程序允许在执行用户程序时修改程序,这就要求在解释程序工作的整个过程中,源程序、符号表等内容始终存放在存储区中,并且要求存放格式要设计易于使用和修改。
解释程序的缺点:程序的解释是非常慢的,并且解释程序需要更大的空间开销。
3.2.处理源程序的软件工具
- 语言的结构化编辑器:用户可以使用这种编辑器在语言的语法制导下编制出所需的源程序。这一类编辑器不仅具有通常的编辑和修改功能,还会对源程序正文进行逐行分析并完成输入检查、自动提供关键字等任务。
- 语言程序的调试工具:该类工具允许用户一行一行来跟踪程序,查看变量和数据结构的变化。调试的功能越强,实现越复杂,涉及到源程序的语法分析和语义处理技术。
- 程序格式化工具:程序格式化工具分析源程序,并可以将程序以结构清晰可读的形式打印出来。
-
语言程序测试工具:可以分为静态分析器和动态测试器两种。
- 静态分析器:在不运行程序的情况下对源程序进行静态分析,以发现程序中潜在的错误或异常;
- 动态测试器:在源程序分析的基础上,将用于记录和现实程序执行轨迹的语句或函数插入到源程序的适当位置,并用测试用例来记录和显示程序运行时的路径,将运行结果与期望的结果进行比较分析,帮助编程人员找到问题。
- 程序理解工具:对程序进行分析,确定模块间的调用关系,记录程序数据的静态属性和结构属性,并画出控制流程图,帮助用户理解程序。
- 高级语言之间的转换工具:把一种高级语言转换为另一种高级语言的工具。这与实现一个完整的编译程序相比工作量小一些。
4.PL/0语言编译系统
PL/0语言编译系统概述:
- 产生背景和基本组成:PL/0语言编译系统是世界著名计算机科学家N.Wirth编写的,由编译程序和解释程序两部分构成。
- PL/0编译程序:源语言为PL/0,目标语言是一个类P-code的代码。
PL/0语言编译系统组成:PL/0语言编译程序由编译程序和解释程序两部分组成,分别称为PL/0编译程序和类P-code解释程序。当编译程序正常阶数时,PL/0语言编译系统会自动调用解释程序,解释执行生成的目标程序。
PL/0编译程序的书写:可以用C、Pascal或Java等语言书写。
PL/0语言概述:PL/0语言的程序结构很简单,是Pascal的一个子集。文章来源:https://www.toymoban.com/news/detail-449395.html
程序语言的语法描述:程序语言的语法描述常常采用一种被称为扩展巴克斯范式(EBNF)的形式。文章来源地址https://www.toymoban.com/news/detail-449395.html
到了这里,关于编译原理笔记(一)引论的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!