`
沐刃青蛟
  • 浏览: 6992 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

编译器的探讨

 
阅读更多

 

编译器的探讨

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

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

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

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

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

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

 
   
 

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

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

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

 

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



  

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



  

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

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



  

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



  

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





 
  一些材料参考了网上。

 

  • 大小: 76.1 KB
  • 大小: 32.5 KB
  • 大小: 165 KB
  • 大小: 127.7 KB
  • 大小: 44.2 KB
  • 大小: 69.2 KB
  • 大小: 93.1 KB
分享到:
评论

相关推荐

    编译器词法分析程序实现探讨_朱朝霞.caj

    编译器词法分析程序实现探讨_朱朝霞.caj编译器词法分析程序实现探讨_朱朝霞.caj编译器词法分析程序实现探讨_朱朝霞.caj编译器词法分析程序实现探讨_朱朝霞.caj编译器词法分析程序实现探讨_朱朝霞.caj编译器词法分析...

    高级编译器设计与实现_编译原理_编译器_

    本书首先介绍编译器的结构、符号表管理、中间代码结构、运行时支持等问题,探讨过程内的控制流分析、数据流分析、依赖关系分析和别名分析的各种方法,并介绍一系列的全局优化。接下来,讲述过程间的控制流分析、数据...

    计算机综合实验C语言编译器设计探讨——基于LLVM架构的MIPS后端移植分析.pdf

    计算机综合实验C语言编译器设计探讨——基于LLVM架构的MIPS后端移植分析.pdf

    C语言编译器源代码 学习

    C语言编译器源代码 有研究或探讨或开源的请加群:37424970 或联系本人MSN或邮箱:zhuseahui@yahoo.com.cn

    高级编译器设计与实现(鲸书)

    本书讨论了编译器的结构、符号表管理、中间代码结构、运行时支持问题,以及根据及其描述自动产生代码生成器等。之后,探讨过程内的控制流分析、数据流分析、以来关系分析和别名分析的各种方法,并介绍一系列的全局优

    编译原理,C++编程,实现对C-的语法编译器

    内容:编译原理大作业,对C--(C语言的子集)的语法编译器,包括词法分析和语法分析,使用C++编程。 适用人群:计算机本科大学生 使用场景及目标:本科阶段编译原理大作业,提供解决的一种思路 其他说明:本代码的...

    《高级编译器设计与实现》 [DJVU]

    本书首先介绍编译器的结构、符号表管理、中间代码结构、运行时支持等问题,探讨过程内的控制流分析、数据流分析、依赖关系分析和别名分析的各种方法,并介绍一系列的全局优化。接下来,讲述过程间的控制流分析、数据...

    《自己动手实现Lua:虚拟机、编译器和标准库》_张秀宏_2018-9-27.rar

    作者融合自己丰富的工程实践经验,详细阐述Lua语言的核心语法和实现原理,深入探讨Lua虚拟机、编译器和标准库,并给出了实际可以编译执行的代码。助你从零基础开始编程实现Lua语言,理解脚本语言工作原理。全书分为3...

    基于G C C的交叉编译器研究与开发

    基于G C C的交叉编译器研究与开发 摘 要:随着日前越来越多嵌入式系统的飞速发展,必须快速有效地为之开发合适的交叉编译器 因为 G C C ( G N UC o m p i e r C o l l e c t i o n )...植 实例,对测试方法进行 了探讨.

    [鲸书]高级编译器设计与实现

    本书首先介绍编译器的结构、符号表管理、中间代码结构、运行时支持等问题,探讨过程内的控制流分析、数据流分析、依赖关系分析和别名分析的各种方法,并介绍一系列的全局优化。接下来,讲述过程间的控制流分析、数据...

    《高级编译器设计与实现》 [DJVU]()

    本书首先介绍编译器的结构、符号表管理、中间代码结构、运行时支持等问题,探讨过程内的控制流分析、数据流分析、依赖关系分析和别名分析的各种方法,并介绍一系列的全局优化。接下来,讲述过程间的控制流分析、数据...

    基于GCC的交叉编译器研究与开发

    着日前越来越多嵌入式系统的飞速发展,必须快速有效地为之开发合适的交叉编译器。因为GCC(GNU CompilerCollection)是非常优秀的交叉编译器而且具有很好的可移植性,所以移植GCC是一个...植实例,对测试方法进行了探讨。

    论文研究-IDL3.0编译器符合性测试研究和设计.pdf

    探讨了CORBA符合性测试的发展情况,对OMG IDL编译器符合性测试进行了研究。最后,实现了一种IDL3.0编译器符合性测试方法。

    编译原理(龙书)中文第二版

    编译原理(龙书)中文第二版,《编译原理》全面、深入地探讨了编译器设计方面的重要主题,包括词法分析、语法分析、语法制导定义和语法制导翻译、运行时刻环境、目标代码生成、代码优化技术、并行性检测以及过程间分析...

    VC++6.0编译器编译期存储器分配模型(内存布局)

    简要介绍VC ++ 6.0编译器编译期存储器分配模型(内存布局),探讨不同性质变量在编译时编译器如何安排内存空间,在此基础上通过案例解释了一些与内存布局知识相关的问题。 <br>www.200yi.com提供

    疫情背景下Python编程线上教学模式探讨.pdf

    成果驱动式教学 一、疫情背景下Python面临的教学问题 Python从1991年2月第一个编译器诞生开始,已经发展了近30年,以其清晰、简单、 美丽的特性,成为目前最接近自然语言的通用编程语言。随着市场需求不断增大,其 ...

    通过反汇编理解 C++语言实质探讨

    从一 个具体的例子着手,针对VS.NET集成的C++编译器的编译结果,对其进行反汇编,从而揭示出代码后面编译器所作的许多工作,以使读者对类的构造、存 储、数据成员与成员函数之间的联系等有一个较为深入的理解。

    C语言编嵌入式开发笔记-以led控制程序为例.md

    本文探讨了C语言编译器和交叉编译在嵌入式开发中的重要作用。首先,介绍了编译器的基本原理和作用,将高级语言代码转化为机器码,实现计算机的执行。然后,解释了交叉编译的概念,即在一台平台上生成适用于另一台...

    编译原理教程的实验报告

    这篇文章探讨了与编译器设计和实现有关的三个关键实验:词法分析程序设计、语法分析程序设计和中间代码生成程序设计。 词法分析是编译器中的第一个阶段,它负责将源代码转换为一系列词法单元。本实验旨在设计一个...

    RTTI使用探讨与编码实现

    在C++中如果使用多态继承类,对于多态性的对象,在程序编译时可能会出现无法确定对象的...因此,本文探讨了RTTI的使用细节。同时,由于有些平台C++编译器(如Symbian)并不支持RTTI功能,因此本文实现了C++的RTTI功能。

Global site tag (gtag.js) - Google Analytics