编译器设计 简单梳理 第一章 编译概观

基本概念 第一章 编译概观

编译器

编译器是一种计算器程序,负责将一种语言编写的软件转换为另一种语言编写的程序

  • 前端 用于处理源语言

  • 后端 用于处理目标语言 (某种处理器的指令集)

  • 中间形式 IR(Intermediate Representation) 前后端的连接,其语言独立于源语言和目标语言,常包括一个优化器,分析并重写中间形式

  • 源到源的转换器 目标语言也是一种程序设计语言,例如统一编译成C,再借助C编译器进行二次编译成为计算机指令

解释器和编译器
二者都要分析输入程序,判断是否有效,都会建立内部模型,都要确定执行期间在何处存储值。
前者解释代码产生结果,后者输出可执行指令

ex. JVM Java虚拟机运行字节码

  • 编译的基本原则

    1. 编译器必须保持被编译程序的语义
    2. 编译器必须以某种可察觉的方式改进输入程序
  • 重定目标

    使用不同的前后端,以改变编译器使之针对新处理器生成代码的任务。不同的前端也可以使不同的源转化为统一的IR

  • 优化器

编译器中间的部分,负责分析并转换IR,迭代以改进IR

转换概述

前端

  1. 检查语法
  • 词法分析器

编译器中的一趟,将字符构成的串转换为单词构成的流,推导(derivation)
(p,s)对,p为词类,s为拼写

  • 语法分析器
    编译器中的一趟,判断输入流是否是源语言的一个(合法)句子

  • 类型检查
    编译器中的一趟,检查输入程序中对名字的使用在类型方面是否一致

  1. 中间表示

优化器

  1. 分析

    1. 数据流分析
      在编译时推断运行时值的流动
    2. 相关性分析 dependence analysis
      推断下标表达式的可能值,消除引用数组元素时的歧义
  2. 转换
    根据分析结果重写成一种更高效的形式

后端

遍历IR输出目标机代码,进行次序排列,值的存储位置etc.

  1. 指令选择 instruction selection
    将IR操作 映射为一个或多个目标机操作

    • 虚拟寄存器

      符号寄存器名,编译器用其表示某个值可以保存在寄存器中

  2. 寄存器分配

编译前期使用的虚拟寄存器可能高于目标机寄存器的数目,分配器必须将这些虚拟寄存器映射到实际的目标机寄存器,要决定哪些值驻留在实际寄存器中,并重写代码,最小化寄存器的使用

  1. 指令调度
    根据不同操作的执行时间,重排操作顺序,最小化等待操作数所浪费的周期数

  2. 代码生成的各组件间的交互

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值