软件分析课笔记——中间表示

这是南京大学《软件分析》第二讲
(十分感谢南大能将这么好的课公开出来,十分感谢李越、谭添老师这么认真的备课,收获很多。笔记中大部分的图都是从老师的视频中截图所得,会添上自己的理解,以及一定的修改)
ps:笔记是上课过程中的记录,所以会有语法、语义等方面的错误,请大家包容和提出,我会时常来看看和修改。

1.编译器和静态分析器

主要讲:静态分析和编译器的关系

编译器

功能:是将程序员写的程序翻译成机器能理解的代码,还要对问题进行报错

  • 源码 -> scanner -> 进行词法分析,规则为常规表达。如果每一个都是合理的就产生一个token。传给下一步
  • tokens -> parser -> 进行语法分析,按照语法规则进行,规则为上下文无关语法。语法检查通过之后,就会产生抽象语法树(AST)
  • AST -> type checker -> 进行语义分析,就是语义是否合理,这边只能检查很简单的语义,规则为属性语法。如果通过之后,就会生成装饰过的AST(decorated AST)
  • 如果还要继续做优化,需要进行转化: decorated AST -> Translator -> 进行转化,生成IR(常常规形式是3地址码)。
  • IR -> Code Generator -> 机器码:最终转换为机器能够识别的代码
    编译器流程
    => 所以,静态分析器就是处于Translator到Code Generator之间。输入的是IR。

所以可以将转换器之前的称为静态分析器的前端、之后称为静态分析器的后端。

但是前端不可缺少,因为之前检查的都是基本的表达式、词法、语法的分析,如果这些都无法通过,就没有必要进行静态分析

2.AST(抽象语法树)和IR

主要讲IR和AST的区别,以及为什么在静态分析器中使用IR,而不是使用AST。

  1. 抽象语法树的举例:

    一个do…while循环:
    举例

  2. IR

    三地址码表示一个do…while循环:
    举例

  3. 区别:

    • AST,高级,和语法形式很接近;IR,低级,和机器码很接近(参考汇编代码)
    • AST,通常语言依赖比较强(语法和语言挂钩);IR,通常和语言无关
    • AST适合快速的类型检查;IR更压缩和统一
    • AST缺少控制流的信息;IR包含控制流信息
    • IR通常作为静态分析器的基础

3.IR: Three-Address Code(3AC)

主要解释了3AC的常规形式和命名原因等。

  1. 3-地址码没有一个形式化的定义。通常的格式是,指令右侧最多只有一个操作符。

    举例:
    举例

  2. 3AC最多包含三个地址

    地址的类型可以是:变量名

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值