编译器做了什么

作者: b64c74899092 | 来源:发表于2016-05-16 11:35 被阅读177次

编译器做了什么


从最直观的角度来讲,编译器就是将高级语言翻译成机器语言的一个工具。

编译的过程一般可以分为6步:

  • 扫描(词法分析)
  • 语法分析
  • 语义分析
  • 源代码优化(生成中间语言)
  • 代码生成
  • 目标代码优化

扫描(词法分析)

源代码程序首先被输入到扫描器,进行词法分析,运用一种类似于有限状态机的算法可以将源代码分割成一系列记号(token)。

词法分析产生的记号一般可以分为如下几类:关键字,标识符,字面量(包含数字,字符串等)和特殊符号。在识别记号的同时,扫描器也完成了其他工作。比如将标识符存放到符号表,将字符串和数字等常量存放到文字表等,以备后面的步骤使用。
对于有预处理的语言,比如C语言,一般不归入编译器范畴而交个一个独立的预处理器。

语法分析

语法分析器将对有扫描器产生的记号进行语法分析,从而产生语法树。整个过程采用了上下文无关语法的分析手段。

在语法分析的同时很多符号的优先级和含义也被确定下来,另外有些符号有多重含义也会进行区分,如果出现表达式不合法,比如括号不匹配,缺少操作符,编译器就会报告语法分析阶段的错误。

语义分析

语法分析仅仅是完成了对表达式语法层的分析,但是并不了解这个语句是否真正有意义,比如两个指针做乘法运算时没有意义的,但是在语法上是合法的。编译器所能分析的语义是静态语义,就是编译期可以确定的语义。

静态语义通常包括声明和类型的匹配,类型的转换。经过语义分析阶段后,整个语法树的表达式都被标识了类型,有些需要类型转换的表达式则会在相应的位置插入转换节点。

源代码优化(生成中间语言)

中间代码使编译器可以被分为前端和后端。编译器前端负责产生机器无关的中间代码,编译器后端将中间代码转换成目标机器代码。

目标代码生成和优化

编译器后端主要包括代码生成器和目标代码优化器。

代码生成器将中间代码转换成目标机器代码,这个过程依赖于目标机器。

目标代码优化器就是对生成的目标代码进行优化,比如选择合适的寻址方式,使用位移来代替乘法,删除多余的指令等。

相关文章

  • 编译器做了什么

    词法分析 语法分析 语义分析 中间语言生成 目标代码生成与优化 其中包括六个步骤:1. 扫描 2. 语法分析 3....

  • 编译器做了什么

    编译器做了什么 从最直观的角度来讲,编译器就是将高级语言翻译成机器语言的一个工具。 编译的过程一般可以分为6步: ...

  • IOS 编译器做了什么?

    原地址:https://objccn.io/issue-6-2/ ,https://objccn.io/issue...

  • 2章 编译和链接

    1. 从源码到可执行件: 4 步 2. 编译器 做了什么 3. 链接器 比 编译器 早出现 (1) 机器指令 + ...

  • 02--编译过程

    [TOC] 通过本章的学习,要了解到以下几个问题 被隐藏了的过程 编译器做了什么 链接器和编译器 模块拼装——静态...

  • Objective-C基础学习之@property基本概念

    1.什么是@property @property是编译器的指令 什么是编译器的指令 ?编译器指令就是用来告诉编译器...

  • @property

    1.什么是@property @property是编译器的指令什么是编译器的指令 ? 编译器指令就是用来告诉编译器...

  • OC语言@property@synthesize和id

    1.property @property是编译器的指令什么是编译器的指令,编译器指令就是用来告诉编译器要做什么 @...

  • synthesize基本使用

    1.什么是@synthesize @synthesize是编译器的指令什么是编译器的指令 ?编译器指令就是用来告诉...

  • 编译原理 -- 编译以及编译过程

    前言 为了了解编译器是什么? 为什么需要编译器? 编译器、高级语言、源代码、机器语言 编译器:首先也是一种电脑程序...

网友评论

    本文标题:编译器做了什么

    本文链接:https://www.haomeiwen.com/subject/jrdbrttx.html