1.1 语言处理器
程序设计语言是向人以及计算机描述计算过程的符号,这个世界依赖于程序设计语言,因为在所有计算机上运行的所有软件都是用某种程序设计语言编写的,但是在一个程序可以运行之前,它首先需要被翻译成另一种能够被计算机执行的形式,完成这项翻译工作的软件系统叫做编译器(compiler)。
简单的说,一个编译器就是一个程序,它可以阅读以某一种语言(源语言)编写的程序,并把该程序翻译成为一个等价的、用另一种语言(目标语言)编写的程序。编译器的重要任务之一是报告它在翻译过程中发现的源程序中的错误。

解释器是另一种常见的语言处理器,它并不通过翻译的方式生成目标程序。从用户的角度看,解释器直接利用用户提供的输入执行源程序中指定的操作。
在把用户输入映射成为输出的过程中,由一个编译器产生的机器语言目标程序通常比一个解释器快很多。然而、解释器的错误诊断效果通常比编译器更好,因为它逐个语句的执行源程序。


Java语言处理器结合了编译和解释过程。一个Java源程序首先被编译成一个称为字节码(bytecode)的中间表示形式,然后由一个虚拟机对得到的字节码以解释执行。这样安排的好处之一是在一台机器上编译得到的字节码可以在另一台机器上解释执行,通过网络就可以完成机器之间的迁移。
为了更快的完成输入到输出的处理,有些被称为及时(just in time)编译器的java编译器在运行中间程序处理输入的前一刻首先把字节码翻译为机器语言,然后再执行程序。

除了编译器之外,创建一个可执行的目标程序还需要一些其他程序。一个源程序可能被分割成多个模块,并存放于独立的文件中。将源程序聚合在一起的任务有时会由一个被称为预处理器(preprocessor)的程序独立完成。预处理器还负责把那些称为宏的缩写形式转换为源语言的语句。
然后将经过预处理的源程序作为输入传递给一个编译器,编译器可能产生一个汇编语言程序作为其输出,因为汇编语言比较容易输出和调试。接着,这个汇编语言程序由称为汇编器(assembler)的程序进行处理,并生成可重定位的机器代码。
大型程序经常被分成多个部分进行编译,因此,可重定位的机器代码有必要和其他可重定位的目标文件以及库文件连接到一起,形成真正在机器上运行的代码。一个文件中的代码可能指向另一个文件中的位置,而链接器(linker)能够解决外部内存地址的问题。最后,加载器(loader)把所有的可执行目标文件放到内存当中执行。

1.1 节练习:
(1)编译器和解释器之间的区别是什么?
答 :编译器把高级语言源程序直接翻译得到二进制可执行文件,需要经过预处理,编译,汇编,链接四个阶段,一次翻译,可多次重复执行,效率高。以java解释器为例,java解释器并不直接翻译得到二进制可执行文件,java翻译器将java代码翻译得到中间代码字节码,然后字节码在java专用的环境java虚拟机中逐语句执行,效率较低,但易于发现问题。
(2)编译器相对于解释器的优点是什么?解释器相对于编译器的优点是什么?
答:编译器只需要对源程序编译一次,便可多次零开销的执行,效率高,而且执行环境要求不高;java每次执行都需要翻译成字节码,然后在专用的环境中执行,效率低。解释器容易发现bug,因为是逐语句执行代码,编译器编译出的程序执行速度非常快,较难发现bug。
(3)在一个语言处理系统中,编译器产生汇编语言而不是机器语言的好处是什么?
答:汇编语言是一些英文单词,操作数,操作名称,地址的集合,比较容易输出和调试;而机器语言是二进制语言,人类根本看不懂,也就无法调试了。
(4)把一种高级语言翻译成为另一种高级语言的编译器称为源到源的翻译器。编译器使用C语言作为目标语言有什么好处?
答:C语言是最开始,最基本的语言。
(5)描述一下汇编器要完成的一些任务。
答:汇编器要把输入的汇编语言程序翻译为可重定位目标文件并输出。
Comments NOTHING