菜单
首页 > 常识 >

编译程序是一种什么程序(第一章 编译概述)

100次浏览     发布时间:2024-11-01 10:01:13     编辑: 71n

重点:高级语言的编译过程

1. 汇编程序:将汇编语言程序翻译为机器语言程序。

2. 翻译程序:把一种语言书写的程序翻译为另一种语言书写的程序的程序统称为翻译程序。

3. 编译程序:将高级语言程序翻译为对应的低级语言程序,然后再运行这个语言程序,这个翻译程序称为编译程序,又称编译器。

4. 解释程序:将高级程序设计语言的源程序作为输入,边解释边执行源程序本身,而不产生目标程序的翻译程序。

5. 源程序:源程序,也被称为源代码,是未经编译的、按照特定的程序设计语言规范编写的文本文件。

6. 目标程序:目标程序又称为“目的程序”,是源程序经编译后可直接被计算机运行的机器码集合。

7. :是指对源程序或其等价的中间表示形式从头到尾扫描并完成规定任务的过程。每遍的结构存入外存中,作为下一遍的输入。

8. 前端:包括词法分析、语法分析、语义分析和中间代码生成,以及部分代码优化工作,是对源程序进行分析的过程。它主要与源语言有关,与目标机无关,主要根据源语言的定义静态分析源程序的结构,以检查是否符合语言的规定,确定源程序所表示的对象和规定的操作,并以某种中间形式表示出来。

9. 后端:包括部分代码优化和目标代码生产,是对分析过程的综合,与源语言无关,依赖于中间语言和目标机,主要是根据分析的结果构造出目标程序。

10. 高级语言程序有哪两种执行方式?阐述其主要异同点。描述编译方式执行程序的过程。

1) 高级语言程序的运行有两种方式:

① 编译方式,利用编译程序将高级语言程序翻译为机器语言程序,然后再运行这个机器语言程序。

② 解释方式,利用解释程序直接读取高级语言程序中的每个语句,翻译并直接执行。

2) 异同点:

① 编译程序是源程序的一个转换系统,解释程序是源程序的一个执行系统。

② 编译程序先把全部源程序翻译为目标程序,该目标程序可以反复执行。解释程序对源程序边翻译边执行,目标代码只能执行一次,若需要重新执行,则必须重新解释源程序。

③ 解释程序比编译程序更加通用。解释程序一般是用高级语言编写的,能够在绝大多数类型的计算机上运行,编译程序生成的目标代码只能在特定类型的计算机上运行。

④ 通过编译运行,源程序与数据是在不同的时间进行处理;通过解释程序,源程序和数据是同时处理的。

⑤ 编译方式比解释方式执行快得多,因为编译方式在程序运行阶段就不需要再分析了。而解释器的错误诊断效果通常比编译器更好,因为它逐条语句地执行源程序。

11. 你所使用的C语言编译器中,观察程序1.1经过预处理、编译、汇编、链接四个过程生成的中间结果。

首先对C语言源程序进行预处理,将其中的宏和预处理命令展开转换为标准C语言程序,然后进行编译,生成汇编语言程序,再经过汇编生成二进制目标代码,最后对目标代码进行链接,此时需要将相关的库函数和外部程序一起链接,生成可执行的机器代码。

1) 预处理:C语言的预处理程序首先要对用户源程序中的宏定义和文件包含等进行处理。C语言预处理的结果是标准的C语言程序。如在VC++ 6.0中,通过预处理后,将.c的源程序变为了.i的文本文件。

gcc -E hello.c -o hello.i

2) 编译:标准的C语言程序由编译程序翻译为对应于某个计算机上的汇编语言程序。编译的结果是某种机器上汇编语言书写的程序。如在VC++ 6.0中,编译这一步将.i的文本文件生成了.cod的文本文件,这就是汇编代码。有的编译器生成以.s或.asm为扩展名的文件。

gcc -S hello.i -o hello.s

3) 汇编:汇编语言程序需要由汇编程序翻译为二进制的目标代码(机器语言描述的程序)。大多数编译器生成的目标代码是扩展名为.obj的二进制文件。

gcc -c hello.s -o hello.o

4) 链接:链接程序把目标文件转换为最终可以运行的程序。链接过程中需要修改重定位的地址,修改其中的指令和数据,以便后面的内容放在内存中适当的地方,最终形成可执行文件。如VC++ 6.0编译器链接后生成的文件是扩展名为.exe的可执行文件。

通过链接生成的不一定是可执行程序,也可以是程序库文件。

gcc hello.o -o hello

12. 动态链接和静态链接

1) 静态链接:把公用库内的代码合并到可执行文件内部,使得可执行文件的体积增大。

不足之处:

① 库文件更新,可执行文件得不到及时更新。

② 多个程序调用相同的公用库函数,占用多余的内存空间。

2) 动态链接:允许程序运行前才加载所需的动态链接库,如果内存中存在则不需要重复加载。

不足之处:

① 运行时会增加程序执行的时间开销。

② 动态链接库的版本错误则可能导致程序无法运行。

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

编译程序可按照其任务分成6个模块完成:词法分析器、语法分析器、语义分析器、中间代码生成器、代码优化器和目标代码生成器。

1) 词法分析器:读入源程序,进行词法分析,输出单词记号。

2) 语法分析器:对单词记号进行语法分析,识别出各类语法单位,最终判断输入串是否构成语法上正确的程序。

3) 语义分析器:将各种符号的必要信息填入符号表,并按照语义规则对语法分析器识别出的语法单位进行静态语义检查。

4) 中间代码生成器:将语法分析器识别出的各个语法单位翻译成一定形式的中间代码。

5) 代码优化器:对生成的中间代码进行优化处理。

6) 目标代码生成器:把中间代码或优化后的中间代码翻译为目标代码。

14. 构造编译程序的五种方法

1) 直接用机器语言或汇编语言编写

2) 用高级语言编写编译程序

3) 自编译(自扩展)方式

4) 用编译工具自动生成部分程序

5) 移植:同种语言的编译程序在不同类型的机器之间移植

15. 构造编译程序要掌握以下几方面的内容:

1) 源程序:编译程序处理的对象。对被编译的源语言要深刻理解其结构和含义。

2) 目标语言与目标机:编译程序处理的结果和运行环境。对机器的硬件结构、操作系统的功能、汇编指令等都必须很清楚。

3) 编译方法和工具:是生成编译程序的关键。

16. 编译技术可应用在哪些领域?

1) 各种软件工具的开发,格式化工具、调试工具、测试工具等。

2) 程序的翻译,高级语言的转换程序、交叉编译程序、硬件合成、数据库查询语言SQL解释器

3) 新型体系结构的设计

17. 为什么要学习编译原理及其构造技术?

1) 有助于深刻理解和正确使用程序设计语言

2) 有助于加深对整个计算机系统的理解

3) 设计开发编译程序的软件技术同样可以用于其它软件的设计开发

4) 编译技术的地位变得越来越重要。