`
universsky
  • 浏览: 92308 次
文章分类
社区版块
存档分类
最新评论

编译器

 
阅读更多

将“高级语言”翻译为“机器语言(低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 汇编程序 (assembler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)

高级计算机语言便于人编写,阅读,维护。低阶机器语言是计算机能直接解读、运行的。编译器将源程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序。源代码一般为高级语言 (High-level language), 如Pascal、C、C++、C#、Java等,而目标语言则是汇编语言或目标机器的目标代码(Object code),有时也称作机器代码(Machine code)。

处理器

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

前端

前端主要负责解析(parse)输入的源代码,由语法分析器和语意分析器协同工作语法分析器负责把源代码中的‘单词’(Token)找出来,语意分析器把这些分散的单词按预先定义好的语法组装成有意义的表达式,语句 ,函数等等。 例如“a = b + c;”前端语法分析器看到的是“a, =, b , +, c;”,语意分析器按定义的语法,先把他们组装成表达式“b + c”,再组装成“a = b + c”的语句。 前端还负责语义(semantic checking)的检查,例如检测参与运算的变量是否是同一类型的,简单的错误处理。最终的结果常常是一个抽象的语法树(abstract syntax tree,或 AST),这样后端可以在此基础上进一步优化,处理。

后端

编译器后端主要负责分析,优化中间代码(Intermediate representation)以及生成机器代码(Code Generation)。
一般说来所有的编译器分析,优化,变型都可以分成两大类: 函数内(intraprocedural)还是函数之间(interprocedural)进行。很明显,函数间的分析,优化更准确,但需要更长的时间来完成。

常见的编译分析有函数调用树(call tree),控制流程图(Control flow graph),以及在此基础上的 变量定义-使用,使用-定义链(define-use/use-define or u-d/d-u chain),变量别名分析(alias analysis),指针分析(pointer analysis),数据依赖分析(data dependence analysis)等。

程序分析结果是编译器优化(compiler optimization)和程序变形(compiler transformation)的前提条件。常见的优化和变形有:函数内嵌(inlining),无用代码删除(Dead code elimination),标准化循环结构(loop normalization),循环体展开(loop unrolling),循环体合并,分裂(loop fusion,loop fission),数组填充(array padding),等等。 优化和变形的目的是减少代码的长度,提高内存(memory),缓存(cache)的使用率,减少读写磁盘,访问网络数据的频率。更高级的优化甚至可以把序列化的代码(serial code)变成并行运算,多线程的代码(parallelized,multi-threadedcode)。
机器代码的生成是优化变型后的中间代码转换成机器指令的过程。现代编译器主要采用生成汇编代码(assembly code)的策略,而不直接生成二进制的目标代码(binary object code)。即使在代码生成阶段,高级编译器仍然要做很多分析,优化,变形的工作。例如如何分配寄存器(register allocatioin),如何选择合适的机器指令(instruction selection),如何合并几句代码成一句等等。
工作方法
首先编译器进行语法分析,也就是要把那些字符串分离出来。
然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。
最后生成的是目标文件,也称为obj文件。
再经过链接器的链接就可以生成最后的可执行代码了。
有些时候需要把多个文件产生的目标文件进行链接,产生最后的代码。这一过程称为交叉链接。
编辑本段进行对比
许多人将高阶程序语言分为两类:编译型语言和直译型语言。然而,实际上,这些语言中的大多数既可用编译型实现也可用直译型实现,分类实际上反映的是那种语言常见的实现方式。(但是,某些直译型语言,很难用编译型实现。比如那些允许 在线代码更改 的直译型语言。)
历史
20世纪50年代,IBM的John Backus带领一个研究小组对FORTRAN语言及其编译器进行开发。但由于当时人们对编译理论了解不多,开发工作变得既复杂又艰苦。与此同时,Noam Chomsky开始了他对自然语言结构的研究。他的发现最终使得编译器的结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法的难易程度以及识别它们所需要的算法来对语言分类。正如Chomsky架构(Chomsky Hierarchy),它包括了文法的四个层次:0型文法、1型文法、2型文法和3型文法,且其中的每一个都是其前者的特殊情况。2型文法(或上下文无关文法)被证明是程序设计语言中最有用的,而且今天它已代表着程序设计语言结构的标准方式。分析问题(parsing problem,用于上下文无关文法识别的有效算法)的研究是在60年代和70年代,它相当完善的解决了这个问题。它已是编译原理中的一个标准部分。
有限状态自动机(Finite Automation)和正则表达式(Regular Expression)同上下文无关文法紧密相关,它们与Chomsky的3型文法相对应。对它们的研究与Chomsky的研究几乎同时开始,并且引出了表示程序设计语言的单词的符号方式。
人们接着又深化了生成有效目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常将其称为优化技术(Optimization Technique),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(Code Improvement Technique)。
当分析问题变得好懂起来时,人们就在开发程序上花费了很大的功夫来研究这一部分的编译器自动构造。这些程序最初被称为编译器的编译器(Compiler-compiler),但更确切地应称为分析程序生成器(Parser Generator),这是因为它们仅仅能够自动处理编译的一部分。这些程序中最著名的是Yacc(Yet Another Compiler-compiler),它是由Steve Johnson在1975年为Unix系统编写的。类似的,有限状态自动机的研究也发展了一种称为扫描程序生成器(Scanner Generator)的工具,Lex(与Yacc同时,由Mike Lesk为Unix系统开发)是这其中的佼佼者。
在20世纪70年代后期和80年代早期,大量的项目都贯注于编译器其它部分的生成自动化,这其中就包括了代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。
编译器设计最近的发展包括:首先,编译器包括了更加复杂算法的应用程序它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言的发展结合在一起。其中典型的有用于函数语言编译的Hindley-Milner类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境(Interactive Development Environment,IDE)的一部分,它包括了编辑器、连接程序、调试程序以及项目管理程序。这样的IDE标准并没有多少,但是对标准的窗口环境进行开发已成为方向。另一方面,尽管在编译原理领域进行了大量的研究,但是基本的编译器设计原理在近20年中都没有多大的改变,它正迅速地成为计算机科学课程中的中心环节。
在20世纪90年代,作为GNU项目或其它开放源代码项目标一部分,许多免费编译器和编译器开发工具被开发出来。这些工具可用来编译所有的计算机程序语言。它们中的一些项目被认为是高质量的,而且对现代编译理论感兴趣的人可以很容易的得到它们的免费源代码。
大约在1999年,SGI公布了他们的一个工业化的并行化优化编译器Pro64的源代码,后被全世界多个编译器研究小组用来做研究平台,并命名为Open64。Open64的设计结构好,分析优化全面,是编译器高级研究的理想平台。
编译器相关专业术语:
1. compiler
编译器;编译程序
2. on-line compiler
连线编译器
3. precompiler
预编译器
4. serial compiler
串行编译器
5. system-specific compiler
特殊系统编译器
6. Information Presentation Facility Compiler
信息展示设施编译器
7. Compiler Monitor System
编译器监视系统

分享到:
评论

相关推荐

    自己动手写编译器、链接器_编译器_

    本书讲述了一个真实编译器的开发过程源语言是以C语言为蓝本进行适当简化定义的一门新语言称之为SC语言(简化的C语言)目标语言是大家熟悉的Intelx86机器语言。在本书中读者将看到从 SC语言定义到SCC编译器开发的完整...

    编译器设计(第2版)完整.pdf版

    构建现代编译器必需的核心技术 是不可多得的参考手册 <br/>深入剖析现代编译器运用的算法和技术, 强调代码优化和代码生成, 体现编译原理教学的最新理念, 本书旨在介绍编译器构造法中的艺术和科学。书中深入分析...

    全面了解C/C++编译器与集成开发环境

    第一节 GCC家族编译器 第二节 MS家族编译器 第三节 Borland家族编译器 第四节 Watcom家族编译器 第五节 其它编译器 目前,说到C/C++集成开发环境,大部分人想到的是VC++。其实,除了VC++外,还有很多种编译器与...

    nasm编译器nasm编译器nasm编译器

    汇编编译器 win32nasm编译器nasm编译器nasm编译器

    [网盘]编译器设计(第2版)完整.pdf版.2018_03_17

    构建现代编译器必需的核心技术 是不可多得的参考手册 <br/>深入剖析现代编译器运用的算法和技术, 强调代码优化和代码生成, 体现编译原理教学的最新理念, 本书旨在介绍编译器构造法中的艺术和科学。书中深入分析...

    matlab找不到编译器的问题

    matlab在关联编译器的时候,会出现找不到编译器的问题,原因是matlab要找windows sdk的mt.exe,找不到报错的.因为vs2012在安装时,windows sdk的mt.exe位置变了,而matlab还是按照老的路径找,肯定找不到(原来在windows ...

    TC编译器TC编译器TC编译器

    TC编译器TC编译器TC编译器TC编译器TC编译器TC编译器TC编译器TC编译器TC编译器TC编译器TC编译器TC编译器

    matlab2016b配置Microsoft Visual Studio2017编译器补丁

    未找到支持的编译器或 SDK。您可以安装免费提供的 MinGW-w64 C/C++ 编译器;请参阅安装 MinGW-w64 编译器‘ 解决matlab2016b配置VS2017编译器时未找到支持的编译器或 SDK的补丁文件:(1)msvc2017.xml (2)msvcpp2017....

    瑞萨CS+编译器资料_中文编译器

    瑞萨CS+编译器资料

    Matlab关联Visual Studio 2013编译器

    matlab在关联编译器的时候 会出现找不到编译器的问题 原因是matlab要找windows sdk的mt exe 本文件修改方法也是根据wiills的那篇“matlab找不到编译器的问题”(matlab无法找到vs2012)的修改方法进行的 请参考:...

    Intel Parallel Studio XE Cluster版2(C/C++ 编译器2012)

    Intel Parallel Studio XE Cluster版C/C++ Fortran编译器,是一种主要针对Inetl平台的高性能编译器,可用于开发复杂且要进行大量计算的C/C++、Fortran程序。 Intel编译器编译C和C++源程序的编译命令分别为`icc`和`...

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

    本书涵盖了现代微处理器编译器的设计和实现方面的所有高级主题。本书首先介绍编译器的结构、符号表管理、中间代码结构、运行时支持等问题,探讨过程内的控制流分析、数据流分析、依赖关系分析和别名分析的各种方法,...

    汇编语言集成器编译器

    16位汇编语言所需全套编译器 bin目录里为本软件 files目录为汇编语言写的用于测试的程序 masm为MASM类型的编译器,其中:masm.exe为编译器,link.exe为连接器 tasm为TASM类型的编译器,其中:tasm.exe为编译器,...

    现代编译器的Java实现

    本书介绍了编译器的各个方面,包括词法分析,语法分析,抽象语法,语义行为,中间表示,通过树匹配选择指令,数据流分析,用色图法实现寄存器分配,运行时间系统。本书还讲述了通用的编译器实现技术,包括代码生成、...

    伟福编译器伟福编译器伟福编译器

    伟福编译器伟福编译器伟福编译器伟福编译器伟福编译器伟福编译器伟福编译器伟福编译器伟福编译器伟福编译器伟福编译器伟福编译器伟福编译器伟福编译器伟福编译器

    NASM 编译器,NASM 编译器

    NASM 编译器NASM 编译器NASM 编译器NASM 编译器NASM 编译器NASM 编译器NASM 编译器NASM 编译器NASM 编译器

    vs2015 msvc编译器

    vc2015编译器,免安装,解压缩就能用。双击MSVC2015命令行就能运行cl、nmake等所有命令

    MCS-51智能反编译器 v1.0中文版(51单片机反编译工具).zip

    MCS-51智能反编译器 v1.0中文版(51单片机反编译工具)zip,MCS-51智能反编译器。可将51单片机的bin或hex文件反编译为汇编码。在写进了MCU的程序中,都是二进制的文件,如ROM和BIN文件,都是经过编译后生成的二进制可...

    编译器设计之路 裘巍

    《编译器设计之路》系统地介绍了一个实际的Pascal编译器Neo Pascal的设计与实现。结合Neo Pascal的源代码,详细讲述了LL(1)语法分析器、符号表系统、中间表示、类型系统、优化技术、运行时刻的存储管理、代码生成...

    c语言实现C编译器c语言实现C编译器

    c语言实现C编译器c语言实现C编译器c语言实现C编译器c语言实现C编译器c语言实现C编译器c语言实现C编译器c语言实现C编译器c语言实现C编译器c语言实现C编译器c语言实现C编译器c语言实现C编译器

Global site tag (gtag.js) - Google Analytics