这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
Day8
编译器和静态分析
编译器
-
将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序
-
现代编译器的主要工作流程
源代码 (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(),继续分析
- 过程间分析需要同时分析控制流和数据流——联合求解,比较复杂