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

编译器

 
阅读更多

将“高级语言”翻译为“机器语言(低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (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编译器开发的完整...

    vs2015 msvc编译器

    VS2015 MSVC编译器是Visual Studio 2015中的一部分,它包含了Microsoft的C++编译器工具集,用于构建Windows平台上的应用程序。MSVC(Microsoft Visual C++)是微软开发的一款集成开发环境,支持C++语言,并提供了...

    PICC编译器 V9.8.3_PICC编译器_

    **PICC编译器 V9.8.3 知识点详解** PICC编译器是Microchip Technology公司推出的专门用于开发和编译基于Microchip PIC微控制器(MCU)程序的工具。这个版本,V9.8.3,是针对特定型号的DSPIC16F系列MCU设计的,提供...

    易语言黑月编译器5.7,黑月编译器V3.53

    易语言黑月编译器是针对易语言编程环境的一个第三方编译工具,旨在提供更高效、更便捷的程序编译服务。易语言是中国自主研发的一种高级编程语言,它以汉字作为编程的基本元素,使得编程变得更加直观易懂,尤其适合...

    参考lua编译器C#自制编译器

    标题中的“参考lua编译器C#自制编译器”是指使用C#编程语言来创建一个自定义的Lua编译器。Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和自动化脚本等场景。C#是微软开发的一种面向对象的编程语言,具有...

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

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

    编译原理编译器调研报告

    【编译原理与编译器】 编译原理是一门涉及计算机科学的核心课程,它研究如何将高级编程语言转换成机器可执行的低级代码。编译器是这一原理的实际应用,它扮演着人类程序员与计算机硬件之间的桥梁角色,使得程序员...

    简单的编译器(c++实现)

    本项目“简单的编译器(C++实现)”旨在通过C++编程语言来构建一个基本的编译器,使初学者能理解编译器的工作原理,并具备实际编写编译器的能力。下面我们将深入探讨编译器的基本概念、结构和实现过程。 一、编译器...

    C编译器剖析PDF文档_UCC162.3源代码

    《C编译器剖析》PDF文档是一份深入探讨C语言编译原理和技术的资料,它为读者揭示了C编译器的工作机制,帮助开发者更好地理解编译过程中的各种概念和优化策略。这份文档通常会涵盖以下几个核心知识点: 1. **词法...

    lcc-master_lcc编译器_

    **lcc编译器——一个轻量级C编译器** **一、lcc编译器简介** lcc是一款开源的、轻量级的C语言编译器,它由Dennis M. Ritchie和Steve A. Johnson在贝尔实验室开发。lcc的设计目标是作为一个教学工具,用于讲解编译器...

    Hi-TECH-PICC C 语言编译器

    《Hi-TECH PICC C 语言编译器详解》 Hi-TECH PICC C 语言编译器是一款专为Microchip公司的PIC微控制器设计的C语言编译工具,它使得开发者能够用高级的C语言进行嵌入式系统的编程,从而提高了开发效率和代码的可读性...

    rvct_编译器用户指南.pdf

    ### RVCT 编译器用户指南关键知识点 #### 1. 概述 - **RVCT**(RealView Compiler Tools)是由ARM公司开发的一套专为ARM架构设计的编译工具集,旨在帮助开发者高效地编写和优化针对ARM平台的应用程序。 - 该**用户...

    cpp-9cc一个很小的C语言编译器是8cc编译器的继承者

    《C语言编译器探索:从8cc到9cc》 在编程世界中,C语言因其高效、灵活性和广泛的应用范围而备受推崇。然而,理解并编写C语言编译器的过程,对于许多开发者来说,既是一项挑战也是一次深度学习的机会。8cc和9cc就是...

    自己用c#做的C语言编译器内带测试程序

    标题中的“自己用c#做的C语言编译器内带测试程序”表明这是一个个人项目,开发者使用C#编程语言创建了一个小型的C语言编译器,并且这个编译器包含了用于验证其功能的测试程序。这涉及到计算机科学中的编译原理、...

    设计实现一个编译器(java)

    在本项目中,我们将探讨如何使用Java语言设计并实现一个编译器。编译器是计算机科学中的核心组件,它负责将源代码(通常是一种高级编程语言)转换为机器可执行的目标代码。以下是对实现这一过程涉及的关键知识点的...

    自己动手写编译器链接器高清完整版

    根据提供的文件信息,本文将围绕“自己动手写编译器链接器”的主题展开,深入探讨编译器与链接器的基本概念、工作原理及其在实际编程中的应用。 ### 编译器的基本概念 编译器是一种计算机程序,它将一种编程语言...

    义隆单片机C语言编译器用户手册(中文)

    ### 义隆单片机C语言编译器WicePlus用户手册知识点解析 #### 一、义隆单片机C语言编译器简介 义隆单片机C语言编译器WicePlus是一款专为EM78系列单片机设计的C语言编译工具。该编译器的主要功能是将用户的C语言源...

    编译器及编译器生成器

    编译器是计算机科学中的核心组件,它将高级编程语言转换为机器可执行的指令,从而使程序员能够使用抽象和简洁的语法编写代码,而无需直接处理底层硬件细节。编译器的工作过程通常包括词法分析、语法分析、语义分析、...

    可变目标C编译器设计与实现.pdf

    知识点一:编译器的基本概念与功能 编译器是一种计算机程序,它的作用是将一种高级语言编写的源代码转换成另一种特定机器语言的汇编代码或机器代码。它主要完成语言的词法分析、语法分析、语义分析、中间代码生成、...

    LCC源代码(编译器)

    **LCC源代码详解——揭开编译器的神秘面纱** LCC,全称为Little C Compiler,是一款小型的C语言编译器。它的设计初衷是为了教育目的,特别适合那些想要了解编译器工作原理和代码生成过程的学习者。LCC最初只支持...

Global site tag (gtag.js) - Google Analytics