Go语言静态分析|青训营笔记11

79 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 11天

前言-编辑器结构

image.png

  • 重要的系统软件
    • 识别符合语法和非法的程序
    • 生成正确且高效的代码
  • 分析部分(前端front end)
    • 词法分析,生成词素(lexeme)
    • 语法分析,生成语法树
    • 语义分析,收集类型信息,进行语义检查
    • 中间代码生成,生成intermediate representation (IR)
  • 综合部分(后端 back end)
    • 代码优化,机器无关优化,生成优化后的IR
    • 代码生成,生成目标代码

我们主要学习编辑器的后端优化

静态分析

  • 静态分析:不执行程序代码,推导程序的行为,分析程序的性质。

    • 控制流(Control flow):程序执行的流程

    • 数据流(Data flow):数据在控制流上的传递

  • 通过分析控制流和数据流,我们可以知道更多·关于程序的性质(properties)·

    • 根据这些性质优化代码

image.pngimage.pngimage.png

过程内分析和过程间分析

  • 过程内分析(Intra-procedural analysis)

    • 仅在函数内部进行分析
  • 过程间分析(Inter-procedural analysis)

    • 考虑函数调用时参数传递和返回值的数据流和控制流
  • 为什么过程间分析是个问题?

    • 需要通过数据流分析得知i的具体类型,才能知道i.foo0)调用的是哪个foo( )

    • 根据i的具体类型,产生了新的控制流,i.foo( ), 分析继续

    • 过程间分析需要同时分析控制流和数据流--联合求解,比较复杂

image.png

上图中i.foo()指的是A.foo()

总结

  • 编译器的结构与编译的流程

  • 编译器后端优化

  • 数据流分析和控制流分析

  • 过程内分析和过程间分析