【编译系统】【第一讲、绪论】

1.1 什么是编译

  • 编译:将高级语言(源语言)翻译成汇编语言机器语言(目的语言)的过程
  • 源程序 → 预 处 理 器 ( P r e p r o c e s s o r ) \xrightarrow{预处理器(Preprocessor)} (Preprocessor) 经过处理的源程序 → 编 译 器 \xrightarrow{编译器} 汇编语言程序 → 汇 编 器 ( A s s e m b l e r ) \xrightarrow{汇编器(Assembler)} (Assembler) 可重定位的机器代码 → 链 接 器 ( L i n k e r ) / 加 载 器 ( L o a d e r ) \xrightarrow{链接器(Linker)/加载器(Loader)} (Linker)/(Loader) 目标机器代码

1.2 编译系统的结构

  • 人工翻译的例子: → 源 语 言 句 子 \xrightarrow{源语言句子} 分析源语言(语义分析) → 句 子 的 语 义 \xrightarrow{句子的语义} 生成目标语言 → 目 标 语 言 句 子 \xrightarrow{目标语言句子}
  • 语义分析(Semantic Analysis):划分句子成分,通过短语
  • 语法分析(Syntax Analysis):识别各类短语,通过词性
  • 词法分析(Lexical Analysis):识别词性
  • 中间表示:独立于具体语言
  • 编译器的结构(阶段): → 字 符 流 \xrightarrow{字符流} 词法分析器 → 词 法 单 元 流 \xrightarrow{词法单元流} 语法分析器 → 语 法 树 \xrightarrow{语法树} 语义分析器 → 语 法 树 \xrightarrow{语法树} 中间代码生成器 → 中 间 表 示 形 式 \xrightarrow{中间表示形式} 机器无关代码优化器 → 中 间 表 示 形 式 \xrightarrow{中间表示形式} 目标代码生成器 → 目 标 机 器 语 言 \xrightarrow{目标机器语言} 机器相关代码优化器 → 目 标 机 器 语 言 \xrightarrow{目标机器语言}
    1. 分析部分/前端(front end):中间代码生成器之前,与源语言相关
    2. 综合部分/后端(back end):中间表示形式之后,与目标语言相关
  • 语法制导翻译(Syntax Directed Translation):在语法分析的同时进行语义分析

1.3 词法分析概述

  • 源程序 → 从 左 向 右 逐 行 扫 描 , 识 别 各 个 单 词 , 确 定 单 词 类 型 \xrightarrow{从左向右逐行扫描,识别各个单词,确定单词类型} 词法单元(token)集合

  • token:< 种别码, 属性值 >

    1. 关键字:programif 等,一词一码

    2. 标识符:变量名、数组名等,多词一码,通过属性值区别不同标识符

    3. 常量:整型、字符型等,一型一码

    4. 运算符:算数、关系等,一词一码或一型一码

    5. 界限符:一词一码

      注:对于事先可以完全确定的类型,可以为每一个值分配一个码;对于开放集合不能枚举,需要属性值加以标记

  • 词法分析举例:While(value!=100){num++}

    1. while < W H I L E , − > < WHILE, - > <WHILE,>
    2. ( < S L P , − > < SLP, - > <SLP,>
    3. value < I D N , v a l u e > < IDN, value > <IDN,value>
    4. != < N E , − > < NE, - > <NE,>
    5. 100 < C O N S T , 100 > < CONST, 100 > <CONST,100>
    6. ) < S R P , − > < SRP, - > <SRP,>
    7. { < L P , − > < LP, - > <LP,>
    8. num < I D N , n u m > < IDN, num > <IDN,num>
    9. ++ < I N C , − > < INC, - > <INC,>
    10. ; < S E M I , − > < SEMI, - > <SEMI,>
    11. } < R P , − > <RP, - > <RP,>
  • 实现词法分析器:第三章

1.4 语法分析概述

  • token 序列 → 识 别 各 类 短 语 , 构 造 语 法 分 析 树 \xrightarrow{识别各类短语,构造语法分析树} 语法分析树(parse tree)

  • 赋值语句的分析树:position = initial + rate * 60

    在这里插入图片描述

  • 变量声明语句的分析树:int a,b,c

    在这里插入图片描述

    在这里插入图片描述

  • 根据语法规则为输入句子构造分析树:第四章

1.5 语义分析概述

  • 收集标识符的属性信息:存放在符号表(Symbol Table)

    1. 种属(Kind):简单变量、复合变量(数组等)

    2. 类型(Type):整型、字符型等

    3. 存储位置、长度

    4. 作用域

    5. 参数和返回值信息

      符号表:(NAME, TYPE, KIND, VAL, ADDR),附带字符串表记录NAME值

      在这里插入图片描述

  • 语义检查

    1. 变量或过程未经声明就使用
    2. 变量或过程重复声明
    3. 运算分量类型不匹配
    4. 操作符与操作数类型不匹配

1.6 中间代码生成

  • 常用的中间表示形式:三地址码(Three-address Code),语法结构树/语法树(Syntax Trees)
  • 三地址码:
    • 三地址:源程序中的名字、常量、编译器生成的临时变量
    • 三地址指令表示:
      1. 四元式(Quardruples):(op, y, z, x)
      2. 三元式(Triples)
      3. 间接三元式(Indirect triples)
  • 举例
  • 根据分析树生成中间代码:第六章

1.7 编译器后端概述

  • 目标代码生成:中间表示形式 → \rightarrow 目标语言
    • 重要任务:为程序中使用的变量合理分配寄存器
  • 代码优化:等价程序变换,是程序运行更快、占用空间更少
    • 减少冗余运算
    • 替换高代价运算
  • 详细介绍:第八、九章
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值