编译器

编译器

电脑术语
编译器能够识别代码中的词汇、句子以及各种特定的格式,并将他们转换成计算机能够识别的二进制形式,这个过程称为编译(Compile)。[1]编译器将源程序作为输入,翻译产生使用目标语言的等价程序。
    中文名:编译器 外文名:Compiler 适用领域: 所属学科: 别 称:译码器 提出者:葛丽丝·霍普 提出时间:20世纪50年代末 适用领域:计算机、单片机、编程语言

基本概述

一个现代编译器的主要工作流程如下:

源代码(sourcecode)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标代码(objectcode)→连接器(Linker)→可执行程序(executables)。

编译语言与解释语言对比:

许多人将高级程序语言分为两类:编译型语言和解释型语言。然而,实际上,这些语言中的大多数既可用编译型实现也可用解释型实现,分类实际上反映的是那种语言常见的实现方式。

编译器是一种特殊的程序,它可以把以特定编程语言写成的程序变为机器可以运行的机器码。

把一个程序写好,这时利用的环境是文本编辑器。这时我程序把程序称为源程序。在此以后程序员可以运行相应的编译器,通过指定需要编译的文件的名称就可以把相应的源文件(通过一个复杂的过程)转化为机器码了。

工作原理

翻译是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器言)。

然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。

也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。

典型的编译器输出是由包含入口点的名字和地址以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。

一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序。

种类概述

编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。

另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。

“源码到源码编译器”是指用一种高级语言作为输入,输出也是高级语言的编译器。

预处理器:预处理器作用是通过代入预定义等程序段将源程序补充完整。

编译器前端:编译器前端,前端主要负责解析输入的源程序,由词法分析器和语法分析器协同工作。

词法分析器负责把源程序中的‘单词’找出来,语法分析器把这些分散的单词按预先定义好的语法组装成有意义的表达式,语句,函数等等。

编译器后端:编译器后端编译器后端主要负责分析,优化中间代码以及生成机器代码。

编译器分析,优化,变型都可以分成两大类:函数内还是函数之间进行。很明显,函数间的分析,优化更准确,但需要更长的时间来完成。

对于函数内的优化,有可以根据优化施加的范围分为,全局的和局部的。其中全局的优化是指该优化需要使用到全局的数据流和控制流信息。而局部的优化是指指导优化的信息来自基本快。

代码分析

编译器分析的对象是前端生成并传递过来的中间代码,现代的优化型编译器常常用好几种层次的中间代码来表示程序,高层的中间代码接近输入的源程序的格式,与输入语言相关,包含更多的全局性的信息,和源程序的结构。

中层的中间代码与输入语言无关,低层的中间代码与机器语言类似。不同的分析,优化发生在最适合的那一层中间代码上。

常见的编译分析有函数调用树,控制流程图,以及在此基础上的变量定义-使用,使用-定义链,变量别名分析,指针分析,数据依赖分析等。

程序分析结果是编译器优化和程序变形的前提条件。常见的优化和变新有:函数内嵌,无用代码删除,标准化循环结构,循环体展开,循环体合并,分裂,数组填充,等等。

优化和变形的目的是减少代码的长度,提高内存,缓存的使用率,减少读写磁盘,访问网络数据的频率。更高级的优化甚至可以把序列化的代码变成并行运算,多线程的代码。

机器代码的生成是优化变型后的中间代码转换成机器指令的过程。现代编译器主要采用生成汇编代码的策略,而不直接生成二进制的目标代码。

即使在代码生成阶段,高级编译器仍然要做很多分析,优化,变形的工作。例如如何分配寄存器,如何选择合适的机器指令,如何合并几句代码成一句等等。

工作方法

首先编译器进行语法分析,也就是要把那些字符串分离出来。

然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。

最后生成的是目标文件,也称为obj文件。

再经过链接器的链接就可以生成最后的可执行代码了。

有些时候需要把多个文件产生的目标文件进行链接,产生最后的代码。这一过程称为交叉链接。

相关词条

相关搜索

其它词条