编译器的探讨

编译器的探讨

编译器,简单的讲,就是将高级的源语言等价地翻译为低级的目标语言的一个翻译器,作为计算机行业发展的支柱之一(另一是高级程序设计语言),编译器可以说是划时代的改变。

20世纪50年代,IBMJohn Backus带领一个研究小组对FORTRAN语言及其编译器进行开发。第一个编译器就应运而生。那么,到底是为了满足什么需求,才产生了编译器?

这就得从计算机程序设计语言的发展来看了。最初的第一代语言-----机器语言,是十分简单而傻瓜的,其指令全部由01构成。因此,辨别和记忆它的指令内容就十分困难。为了解决这个困难,第二代语言-----汇编语言自然就产生了。相对来说,它的汇编指令更便于记忆。而第三代语言-----高级程序设计语言的产生,是为了追求更小的开销的,因为人们发现为CPU编写软件(使用汇编语言)比使用编译器所使用的开销要大得多。

其中,机器语言和汇编语言是偏向于机器的,而高级程序设计语言是偏向于人类的(因为它是用了我们更易于接受的文字)。这样就产生了两个极端,机器可识别的是机器语言,而人类抛弃繁琐追求了高级程序设计语言,这样便产生了沟通的障碍。所以编译器就是为了解决人与机器之间的沟通障碍而产生的。

一样东西的发展,必然是机遇伴随着挑战的。编译器的发展也是如此。它有来自三方面的挑战:首先,计算机程序设计语言在不断的发展以及软件系统的复杂化;然后就是,硬件技术的发展,大规模集成电路的产生和多核处理器的发明;最后,是安全性的问题。编译器的发展前景直面这三方面挑战所提出的:要适应新的语言特征和设计新的翻译算法;要提尕使用新硬件的能力,充分发挥新硬件的优势以追求更加高效的编译器;要充分考虑安全性,使得编译器更加可靠。

那么,编译器的工作原理到底是怎样的呢?

 
   
 

其实,一个编译器的工作过程可以分为两个阶段:前段和后端。前段是一个分析的过程,是与机器无关的操作,而后端是一个综合的过程,只与机器有关的操作。这样分为两个阶段的深意是为了方便移植和复用,以实现跨平台的操作。优胜略汰的自然法则嘛。 

至于前段中的一些具体操作,诸如词法分析、语法分析、语句分析等其最终目的是生成中间代码。这一中间代码起着承上启下的作用。因为后端的操作是将中间代码转化为机器可识别的目标代码。

下面我们通过一个具体的例子加深了解一下编译器的工作原理。

 

这是一些高级程序设计语言的语句,经过词法分析后如下:



  

之后是语法分析,生成了非线性的语法树:



  

之后要经过语义分析这一逻辑过程以审查源程序有无语义上的错误(包含类型的错误)。无语义错误后就会生成中间代码。

中间代码产生了还不行,我们是追求完美的人,我们还要对它进行优化(这是与机器无关的优化)。



  

优化之后,产生了终极形态的中间代码,到这里前段的工作就已经完成了。



  

最后阶段就交给后端来处理了。同样的中间代码在经过代码生成器之后生成目标代码(机器可直接识别的指令代码),并经过与机器相关的优化(达到省时省空间的目的)之后生成了最终的目标代码,至此,完成了整个编译的过程。





 
  一些材料参考了网上。

 

猜你喜欢

转载自1452137424.iteye.com/blog/2281359