编译器和静态分析 | 青训营笔记

200 阅读2分钟

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

Day8

视频

PPT

编译器和静态分析

编译器

  • 将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序

  • 现代编译器的主要工作流程

    源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)

编译器的结构

  • 重要的系统软件

    • 识别符合语法和非法的程序
    • 生成正确且高效的代码
  • 分析部分(前端front end)

    • 词法分析scanning,生成词素(lexeme)

      每个词素使用 <token-name, attribute-vallue> 格式的词法单元(token)表示

      position = initial + rate * 60

      <id, 1> <=> <id, 2> < + > <id, 3> < ***** > <60>

    • 语法分析parsing

      • 生成树形的中间表示形式——语法树
    • 语义分析semantic analyzer

      • 收集类型信息,进行语义检查
      • 包括类型检查和类型自动转换
    • 中间代码生成,生成IR(intermediate representation)

  • 综合部分(后端back end)

    • 代码优化,机器无关优化,将IR进一步优化
    • 代码生成,生成目标代码

静态分析

  • 静态分析

    不执行程序代码,推导程序的行为,分析程序的性质

  • 控制流

    程序执行的流程

  • 数据流

    数据在控制流上的传递

通过分析控制流和数据流,可以知道更多关于程序的性质,依此优化代码

过程内/间分析

  • 过程内分析

    仅在函数内部进行分析

  • 过程间分析

    • 对跨越过程边界的信息进行跟踪的数据流分析
    • 考虑函数调用时参数传递和返回值的数据流和控制流
  • 为什么过程间分析是个问题?

    • 需要通过数据流分析得知变量i的具体类型,才能知道i.foo()调用的是A的foo()而不是B的
    • 根据i的具体类型,产生了新的控制流,A.foo(),继续分析
    • 过程间分析需要同时分析控制流和数据流——联合求解,比较复杂