编译原理基础

编译器

答:一个编译器就是一个程序,它可以阅读以某一种语言编写的程序,并把该程序翻译成为一个等价的、用另一种语言编写的程序。编译器的重要任务之一就是报告它在翻译中发现的源程序中的错误

把一种高级语言翻译成为另一种高级语言的编译器称为(source-to-source)的翻译器,翻译器使用C语言作为目标语言有什么好处?

答:就好比为什么编译器要产生汇编语言而是不是机器语言一样,C语言更简单更常用更加容易理解,同样方便调试和输出。

编译器和解释器之间的区别是什么

答:编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;

而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.

编译器相对与解释器的优点是什么?解释器相对与编译器的优点是什么?

答:

  • 一个编译器产生的机器语言目标程序通常比一个解释器快很多;
  • 解释器的错误诊断效果通常比编译器更好。

在一个语言处理系统中,编译器产生汇编语言而不是机器语言的好处是什么

答:就如书中写到的“汇编语言比较容易调试和输出”,这样就减轻了编译器设计的工作量,将部分工作转到汇编器上,使得设计更专注于编译器本身,尽量减少超出其本身所容纳的内容的范围。

描述一下汇编器所要完成的一些任务。

答:汇编器就类似于编译器,只是它的源语言不是高级语言而是汇编语言。同样,它需要一个预处理器进行预处理,如聚合文件,展开宏等。写成的机器语言也要类似与连接器和加载器的程序,完成类似的工作。

创建一个可执行的目标程序

答:除了编译器之外,创建一个可执行的目标程序还需要一些其他程序。一个源程序可能被分割成为多个模块,并存放于独立的文件中。把源程序聚合在一起的任务有时 会由一个被称为预处理器(preprocessor)的程序独立完成。预处理器还负责把那些称为宏的缩写形式转换为源语言的语句。

然后,将经过预处理的源程序作为输入传递给一个编译器。编译器可能产生一个汇编语言程序作为其输出,因为汇编语言容易输出和调试。接着,这个汇编语言程序由称为汇编器(assemble)的程序进行处理,并生成可重定位的机器代码。

大型程序经常被分成多个部分进行编译,因此,可重定位的机器代码有必要和其他可重定位的目标文件以及库文件连接在一起,形成真正在机器上运行的代码。一个 文件中的代码可能指向另一个文件的位置,而链接器(Linker)能够解决外部内存地址的问题。最后,加载器(Loader)把所有的可执行目标文件放到 内存中执行。