编译程序概述
学习编译原理之前,先给大家推荐一些比较经典的书目吧,呵呵,天影楼主(以后就用这名了~)觉得这些书还是很不错的,对于编译原理各位如果只看一两本书的话,个人觉得还是会很有局限。好了,话不多说,下面直接列书单:
《编译原理(清华版)》+《编译原理及实践》+《编译原理:原则,技术和工具》+《现代编译原理-C语言描述》+《高级编译器设计与实现》+《龙书》
看完这些书的话基本上要有一个宏观的对于编译器的结构以及各组成部分比较清晰的了解还是不成问题的~
好了,话不多说,进入正题吧。在学习编译原理之初,天影还是觉得应该先从编译原理的概述开始谈起,下面是天影结合各本书籍写出来的关于本章的列表,先给出列表,这样大家看起来也会先有一个总体的印象一些^_^:
1.1 语言的分类
1.2 编译程序与解释程序
1.3 编译器的功能分解和组织结构
1.4 编译程序的复杂性
1.5 编译程序的设计实现
1.6 编译程序的测试与维护
有了这六节,天影觉得可以对编译程序有一个很基本的了解了,在后面的章节中再具体一个细节一个细节地详细介绍:
1.1 语言的分类:
学了很多年的语言,可能很多同学对于语言的分类都还没有很清晰的了解吧,天影觉得,既然是学习编译原理,对于语言的分类还是得有一个比较清晰的图像的,首先,毋庸置疑,大家都知道计算机语言分为高级语言和低级语言,可是要再细分呢,可能就不知道了吧,呵呵,大致的说来,【 低级语言 = 机器语言 + 汇编语言 】,【 高级语言 = 过程式语言 + 函数式语言 + 逻辑式语言 + 对象式语言 】,下面给一张图:
机器语言就是我们知道的0、1代码;而汇编语言则是介于机器语言和高级语言之间的一种语言,它是和硬件有关的这样一个系统,它与高级语言在编译过程中生成目标代码有直接的关系,天影觉得学习汇编语言主要遇到的困难是因为它一定程度受到了硬件环境的影响,所以学起来相对于其它的高级语言会比较吃力一些。
过程式语言:像Fortran、Basic、C、Cobol、Pacal等,它需要用户了解功能是如何实现的。
函数式语言:像Lisp、ML、ASL,在人工智能上一般会用到这些语言,其它地方倒是用的不多。
逻辑式语言:像Prolog,它是在软件工程上用于测试的一种语言。
对象式语言:像C++、Java、Smalltalk,它与过程式语言的主要区别在于它要把要描述的东西看成一个一个的对象,再把对象上的所以操作封装在一起,如Smalltalk是一门纯粹的从内核开始往外都是面向对象的,它是最正宗的面向对象的语言,对于C++,它是在C语言上的一个改进,所以不能说是完完全全纯粹的面向对象的。
对于各种语言的分类有了一个大致的了解,可是这还是不够的,因为并没有弄清楚各种语言程序之间的关系,下面天影为大家再准备一张图,大家看过之后对于各种语言之间的关系自然也就一目了然了,希望对大家能够有所帮助,呵呵~
看到这里是不是又有一点晕了呢,各种语言程序不放一起还好,这一下子放一起了还真不好区分了,呵呵,下面天影就为大家一一讲解这些语言程序:
汇编语言程序:它与汇编程序只相差两个字,看上去似乎差不多,如果不放在一起的话说不定还真的没有注意到要去区分它们。其实,如果告诉大家汇编语言程序的另外一个名字——汇编语言源程序的话,大家可能就理解多了,呵呵,顾名思义,汇编语言程序是用汇编语言编写的,根据我们前面对语言的分类不难知道它是一种计算机低级语言程序,在经过汇编、连接之后即可得到我们熟悉的exe文件(可执行程序)。
汇编程序:讲解完了汇编语言程序,那么汇编程序又是什么呢,汇编程序是一种把汇编语言书写的程序翻译成为与之等价的机器语言的翻译程序,它输入的是用汇编语言编写的源程序,输出的则是用机器语言表示的目标程序,就这么讲解可能很难懂,结合上面天影给出的图的话会清晰得多的,呵呵。
机器语言程序:前面解释了什么是汇编语言程序,现在大家理解起来机器语言程序应该不难了吧,就是用机器语言表示的目标程序。
高级语言程序:即用高级语言编写的源程序。
编译程序:这里,天影提醒大家要注意的是编译程序与汇编程序的区别,编译程序是把用高级语言编写的源程序翻译成与之等价的用机器语言书写的目标语言的翻译程序,而我们前面说到过的汇编程序是将汇编语言编写的源程序翻译成为等价的用机器语言表示的目标程序。也就是说汇编程序输入的是用汇编语言编写的源程序,输出的是用机器语言表示的目标程序;而编译程序输入的是用高级语言编写的源程序,输出的是用机器语言书写的目标程序,二者之间的区别大家一定要注意区分。
源程序:说源程序之前天影想先说一下什么是源语言,既然叫做源语言,顾名思义,肯定是可以导出另一种语言的,因此,我们可以将源语言理解为可以导出另一种语言的语言,所以,源程序可以是高级语言写的也可以是汇编语言写的。接下来,就来说说什么是源程序,既然是程序,还是“源”的,那么说明它经过“处理机”处理之后会变成别的东西,这个处理机就是编译器,因此,源程序就是指经过编译器编译或解释后生成的具有一定功能的文件或组件或接口,当然,既然是程序,它也就得符合一定的语法,这个不用多说。
目标程序:说完源程序之后再说目标程序想必大家就容易理解多了,目标程序就是由编译程序将源程序翻译成为的等价的由机器码构成的计算机能够直接运行的程序。
下面谈谈机器语言、汇编语言、高级语言这三种语言之间的联系和区别。首先,大家必须明白,计算机所能识别的语言只有机器语言,通俗的来说就是由0和1构成的代码,那么汇编语言与机器语言有什么区别呢,它们二者都是直接对硬件进行操作,这是它们之间的共性,不同之处只在于汇编语言的指令采用了英文缩写的标识符来方便记忆和识别罢了,它们也都需要操作者用命令的形式将每一步的具体操作写出来,而每一个指令对应的又往往只是实际操作中一个很微小的动作,可想而知,用它们写出来的程序势必也就很冗长很复杂而且容易出错了。而高级语言呢,它相对于汇编语言对于机器语言的改进的基础上进一步做了改进,不止是用个简单的名字来替代令人头晕目眩的0、1代码,更是将许多相关的机器指令合成为单条指令,再去掉一下与具体操作有关而与完成工作无关的细节啊,自然也就大大简化了程序的指令,编程者入门的门槛也就更低了,这也就是为什么天影之前说汇编语言学习起来相对于高级语言会更加难一些,但是汇编语言也具备高级语言没有的一些优点,根据前面的分析我们知道高级语言将许多相关的机器指令合成为了单条指令,这也就意味着汇编语言所完成的操作不是一般的高级语言所能实现的,同时,我们可以想想,我们看到的源程序经过汇编之后得到的可执行文件是不是一般也比较小呢,而且执行起来速度很快吧。高级语言相对汇编语言来说的话,已经不仅仅是指某一种语言了,它囊括了很多语言例如我们熟悉的C、C++、Java等等,这些语言的命令格式、语法也是不一样的,我们前面提到过,计算机能识别的只有机器语言,因此高级语言是无法被直接识别的,既然不能被直接识别,那么就只有通过转换,接下来天影就按照转换方式的两类——解释类、编译类,来为大家引入下一节。
1.2 编译程序与解释程序(Compiler and Interpreter):
先来解释一下编译程序和解释程序是什么~
编译程序:把高级语言书写的源程序翻译成等价的目标程序的程序。
解释程序:它不会形成目标程序,将源程序作为输入,解释一句后就提交计算机就执行一句。
在这里,天影将会对三种语言处理程序做一个对比,帮助大家理解、记忆,呵呵~
汇编程序、编译程序、解释程序作为三种语言处理程序,稍不注意,就很容易弄混,下面天影一一解释。汇编程序是将用汇编语言书写的源程序翻译成为由机器语言表示的目标程序;编译程序是用高级语言书写的源程序翻译成为机器语言表示的目标程序;解释程序是直接执行源程序,即读一句源程序,翻译一句,执行一句,不产生目标代码。因此,可以看出汇编程序与编译程序的区别在于输入的待翻译的源程序的书写语言不同;而编译程序与解释程序的区别在于编译程序产生目标代码而解释程序不产生目标代码,一个是读一句,翻译一句,执行一句,而另一个是读好了再翻译好了再执行,可想而知,在执行速度上编译程序肯定是要比解释程序快的,为了执行速度,因此一般的高级语言编写的程序都是编译执行的,不过从另外一个角度来考虑,解释程序的人机交互性会好一些。
下面,还是上图:
编译程序:
有一个概念可能大家都没怎么注意过,那就是我们用过的一些如sin、cos这些子程序是什么呢,是怎么编写的呢,这里向大家介绍一个概念——运行系统子程序:它是协助目标程序工作的一些用机器语言编制好的程序。