`
329937021
  • 浏览: 124452 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

什么是编译器?

阅读更多
编译器

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

[编辑]编译器工作方法
首先编译器进行语法分析,也就是要把那些字符串分离出来。然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。最后生成的是目标文件,我们也称为obj文件。再经过链接器的链接就可以生成最后的可执行代码了。有些时候我们需要把多个文件产生的目标文件进行链接,产生最后的代码。我们把一过程称为交叉链接。


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

   * 源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→连接器(链接器,Linker)→可执行程序(executables)

工作原理

编译是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器言)。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。

典型的编译器输出是由包含入口点的名字和地址以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序。


编译器种类

编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高级语言作为输入,输出也是高级语言的编译器。例如: 自动并行化编译器经常采用一种高级语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。


预处理器(preprocessor)

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


编译器前端(frontend)

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


编译器后端(backend)

编译器后端主要负责分析,优化中间代码(Intermediate representation)以及生成机器代码(Code Generation)。


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


编译器分析(compiler analysis)的对象是前端生成并传递过来的中间代码,现代的优化型编译器(optimizing compiler)常常用好几种层次的中间代码来表示程序,高层的中间代码(high level IR)接近输入的源程序的格式,与输入语言相关(language dependent),包含更多的全局性的信息,和源程序的结构;中层的中间代码(middle level IR)与输入语言无关,低层的中间代码(Low level IR)与机器语言类似。 不同的分析,优化发生在最适合的那一层中间代码上。


常见的编译分析有函数调用树(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-threaded code)。


机器代码的生成是优化变型后的中间代码转换成机器指令的过程。现代编译器主要采用生成汇编代码(assembly code)的策略,而不直接生成二进制的目标代码(binary object code)。即使在代码生成阶段,高级编译器仍然要做很多分析,优化,变形的工作。例如如何分配寄存器(register allocatioin),如何选择合适的机器指令(instruction selection),如何合并几句代码成一句等等。
分享到:
评论

相关推荐

    编译原理入门——什么是编译器?

    在本文中,我们将深入探讨什么是编译器,以及编译器的工作原理。 编译器是一种特殊的软件,它的主要任务是将程序员用高级语言(如C、Java、C++)编写的源代码转换为目标机器语言,通常是二进制形式,如.exe或.dll...

    mars编译器1(mips汇编语言编译器)

    mars编译器(mips汇编语言编译运行),可进行mips汇编语言的编写,编译,调试,以及运行等事项。

    compiler:编译器原理,设计,实现和优化

    什么是编译器? 为什么要学习编译器? 如何学习? 编译器实现 列克西耶 解析器 参考 图书 语言实施模式 解析技术 先进的编译器设计与实现 优化现代架构的编译器 编程语言的实践基础 编程语言:应用程序和解释 编写...

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

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

    编译器及编译器生成器

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

    NASM 编译器,NASM 编译器

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

    vs2015 msvc编译器

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

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

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

    JavaScript 编译器Babel.rar

    那么为什么还需要babel语法编译器? babel是一门静态语法编译器,他并不是在程序运行时参与工作,而是在程序运行前先执行语法。需要babel的主要原因是ECMA规范的定制和落实的流程繁琐而漫长,在一个规范落地实现前...

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

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

    C语言子集编译器_编译器_

    标题 "C语言子集编译器" 暗示了我们正在讨论的是一个专注于C语言特定子集的编译器项目。编译器是将高级编程语言(如C语言)转换为机器可执行代码的软件工具。这个项目的重点可能是简化或优化C语言的某些部分,以适应...

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

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

    编译原理编译器调研报告

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

    C#编译器,很吸引人的哟

    C#编译器是开发人员使用C#编程语言构建应用程序的核心工具。C#是一种现代、类型安全且面向对象的编程语言,由微软公司为.NET框架设计。它在软件开发领域广泛应用,尤其在Windows桌面应用、游戏开发(尤其是Unity引擎...

    Keil5的V5编译器

    Keil5的V5编译器是嵌入式开发领域广泛应用的一款强大的集成开发环境(IDE),主要用于编写和编译基于ARM架构的微控制器程序。它由德国Keil Software公司开发,现已被美国Cadence设计系统公司收购。Keil5不仅包含了一...

    编译器与编译器生成器(C++版)

    首先,让我们了解什么是编译器。编译器是一种特殊的程序,它的主要任务是将程序员用高级编程语言(如C++)编写的源代码转换为目标机器可以理解和执行的机器码。这个过程称为编译。编译器包括词法分析器、语法分析器...

    java反编译器0.2.10.windows.rar

    1. **什么是反编译器?** 反编译器是与编译器相反的软件,它的主要任务是将已编译的字节码(.class文件)转换回接近原始源代码的形式。尽管不能完全恢复到原始代码,但可以提供可读性较高的代码,帮助开发者理解...

    易语言C编译器模块

    易语言C编译器模块则是易语言生态系统中的一个重要组成部分,它为易语言提供了与C语言交互的能力,使得易语言的程序能够利用C语言的强大功能和高效性能。 在深入探讨易语言C编译器模块之前,我们先理解一下编译器的...

    简单小型类pascal语言编译器

    《简单小型类Pascal语言编译器》 在编程领域,编译器是连接高级语言与机器语言的关键桥梁。本文将深入探讨一个基于Pascal语言的简单小型编译器的设计与实现,涵盖词法分析、语法分析以及语义分析等核心步骤。 一、...

    lcc编译器 小巧的纯C编译器

    《lcc编译器:小巧而强大的纯C语言编译工具》 lcc编译器,全称为Little C Compiler,是一款轻量级且高效的C语言编译器,它以其小巧的体积、简单的设计以及对标准C语言的良好支持,赢得了开发者们的青睐。在那些网络...

Global site tag (gtag.js) - Google Analytics