编译原理学习笔记:(第一章:引论——1.1节)

时间:2023-01-01 19:36:48

程序设计语言是向人们以及计算机描述计算过程的记号。

在计算机上运行的所有软件都是用某种程序设计语言编写的。

在程序可以运行之前,首先需要被翻译成一种能够被计算机执行的形式。

完成这项翻译工作的软件系统成为编译器(compiler).

1.语言处理器:

  简单的说,一个编译器就是一个程序,它可以阅读以某一种语言(源语言)编写的程序,并把该程序翻译成一个等价的、用另一种语言(目标语言)编写的程序,见图1-1。编译器的重要任务之一是报告它在翻译过程中发现的源程序中的错误。

编译原理学习笔记:(第一章:引论——1.1节) 编译原理学习笔记:(第一章:引论——1.1节)编译原理学习笔记:(第一章:引论——1.1节)

  如果目标程序是一个可执行的机器语言程序,那么它就可以被用户调用,处理输入并产生输出,见图1-2.

  解释器(interpreter) 是另一种常见的语言处理器。它并不通过翻译的方式生成目标程序。从用户的角度看,解释器直接利用用户提供的输入源程序中指定的操作。 见图1-3.

  在把用户输入映射成为输出的过程中,由一个编译器产生的机器语言目标程序通常比一个解释器快很多。然而,解释器的错误诊断效果通常比编译器更好,因为它逐个语句地执行源程序。

例1.1   Java语言处理器结合了编译和解释过程,如图1-4所示。一个Java源程序首先被被编译成一个称为字节码(bytecode)的中间表示形式,然后由一个虚拟机对得到的字节码加以解释执行。这样安排的好处之一是在一台机器上编译得到的字节码可以在另一台机器上解释执行。通过网络就可以完成机器之间的迁移。  为了更快地完成输入到输出的处理,有些被称为即时(just in time)编译器的Java编译器在运行中间程序处理输入的前一刻首先把字节码翻译成为机器语言,然后再执行程序。  如图1-5所示,除了编译器之外,创建一个可执行目标程序还需要一些其他程序。一个源程序可能被分割成多个模块,并存放在独立的文件中。把源程序聚合在一起的任务有时会由一个被称为预处理器(preprocessor)的程序独立完成。预处理器还负责把那些称为宏的缩写形式转换为源语言的语句。  然后,将经过预处理的源程序作为输入传递给一个编译器。编译器可能产生一个汇编语言程序作为其输出,因为汇编语言比较容易输出和调试。接着这个汇编语言程序由称为汇编器(assembler) 的程序进行处理,并生成可重定位的机器代码。  大型程序经常被分成多个部分进行编译,因此,可重定位的机器代码有必要和其他可重定位的目标文件以及库文件连接到一起,形成真正在机器商运行的代码。一个文件中的代码可能指向另一个文件中的位置,而链接器(linker)能够解决外部内存地址的问题。最后加载器(loader)把所有额可执行目标文件放到内存中执行。

编译原理学习笔记:(第一章:引论——1.1节)   编译原理学习笔记:(第一章:引论——1.1节)

练习1.1.1:编译器和解释器之间的区别是什么?

  编译器主要是将一种语言翻译成另一种语言,而解释器主要在于解释用户的行为。  

练习1.1.2:编译器相对于解释器的优点是什么?解释器相对于编译器的优点是什么?

  编译器相对于解释器来说产生机器语言目标程序较快,解释器相对于编译器来说错误诊断效果通常较好,它是逐个语句地执行源程序。

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

  比较容易输出和调试;减轻开发工作量,易于实现,不是每一个开发人员都对机器语言非常了解。

练习1.1.4:把一种高级语言翻译成为另一高级语言的编译器成为源到源(source-to-source)的翻译器。编译器使用C语言作为目标语言有什么好处?

  好比编译器产生汇编语言而不是机器语言一样,容易理解,方便调试和输出。

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

  汇编器类似于编译器,宏展开,指令转换为机器代码 。

 

总结:

  编译器:一个可以将源语言编写的程序翻译成一个等价的另一种目标语言编写的程序 的程序。生成目标程序执行速度快。

  解释器:从用户角度来看,解释器直接利用用户提供的输入执行源程序中指定的操作。由于其逐个语句执行源程序,所以具有更好的错误诊断效果。

  预处理器:把源程序聚合在一起,将称为宏的缩写形式转换为源语言的语句。

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

  链接器:解决外部内存地址的问题。

  加载器:将所有可执行目标文件放到内存中执行。