入门
编程语言是一些符号,用来为人和机器描述计算或者计算指令,我们所熟悉的计算机世界,他完全依赖于编程语言,因为所有的运行在计算机中的软件都是由某些编程语言开发的,但是,一个程序可以运行之前,它必须要翻译成某种形式,使得计算机能够执行它。
The software systems that do this translated are called compilers(由称作编译器的软件系统来做这个翻译的工作!)
这本书(我正在学,是英文的)是关于如何设计和实现编译。我们会发现一些基本的ideas 可以用来为广泛而不同的编程语言和机器构造翻译器。除了构造编译器,这些基本的设计原则和技术可以应用于很多其他的计算机领域,这些领域的技术可能会被计算机科学家多次使用,因为编译器的研究写作涉及各种编程语言、机器架构、编程语言原理、算法,和软件工程。
在这一入门的章节,我们会介绍不同形式的编程语言的编译器,并给出一个高度概括的经典编译器的结构,然后讨论编程语言和机器架构对塑造编译器的趋势。我们包含了一些关于编译器设计和计算机科学原理的关系的研究,和一个编译器技术应用的略述,编译器技术的应用已经超出了编译器本身。我们会以一个简略的论述来结束入门,这个论述说明了一些重要的编程语言概念,他们对于编译器的研究是必须的。
1.1 Language Processors(语言处理器)
让我们快速的开始吧,一个编译器是一个程序,这个程序可以读取另一个使用编程语言编写的程序——源程序——然后翻译它,得到一个等价的,使用另外一种编程语言编写的程序,该语言叫做目标语言,该程序叫做目标程序,如下面的target program。编译器的一个重要的角色职能,就是在翻译的过程中,检测源程序中的错误并向用户报告。
source program ---------》Compiler--------》target program
如果该目标程序是一个机器可以执行的程序,他就可以被用户调用,去处理输入,并产生输出结果
input --------》target program -------》output
解释器是另外一种常用的语言处理器,不同于编译器会翻译源程序文件,产生目标程序,一个解释器会直接执行由用户编写或提供的源程序文件中的详细描述的指令
source program with input synchronously ---------》Interpreter------------》output
通常,由编译器产生的与机器相关的目标程序执行起来比使用迭代获取输入得到输出的解释器更加快!但是,解释器的诊断效果比编译器更好,能更好更有效的发现程序的错误,因为解释器是从源程序文件中,逐条语句解释执行的
比如,Java语言处理器,结合了编译器和解释器,一个Java源程序可能首先会被编译成中间媒介的形式,叫做字节码,这些字节码然后会被虚拟机解释执行,这样做的好处就是,在一台机器上编译后,可以在其他机器上运行,甚至是在网络上,因为只要装了同一个虚拟机,字节码就可以得到一样的解释
为了获得快速的输入到输出的处理,一些Java编译器,称为即时编译器,在他们执行字节码处理输入之前,直接翻译字节码为机器语言
source program--------------》translator(intermediate program with input synchronously)------------》virtual machine-------------------》output
除了需要编译器,一些其他的程序可能还会需要创建一个可执行的目标程序。一个源文件会被分成很多个模块,各个模块分布在不同的源文件中,这样就有一个任务,必须要收集分布在不同文件的程序模块,对于这个任务,编译器委托了一个单独的程序来完成——预处理器。预处理器也给用户编程扩展了一些应用,比如可以使用速记法,称为宏,他们可以分布在程序的任何地方
接下来,被预处理器修改后的源程序将送给编译器,这时,编译器处理源文件后,可能会产生汇编程序做为输出结果,因为把汇编语言作为输出程序将非常易于调试。接下来,汇编语言程序将会被汇编器调用,产生浮动的机器代码作为结果文件
庞大的程序通常会被分块编译,所以浮动的机器代码可能会和其他的浮动文件和库文件链接在一起形成一个机器浮动代码文件被执行。连接器被设计来处理了这件事情,他会处理外部内存地址,这些地方存放的是外部程序代码,然后把各个程序模块通过地址索引成一个索引文件,交给编译器,编译通过这个索引文件来生成跟这个索引文件一样的程序文件,不同的只是,这个程序是可以执行的
《Compilers Principles,Techniques,&Tools》Chapter 1---->Introduction