这是我参与「第五届青训营」伴学笔记创作活动的的第9天
go语言内存管理
编译器和静态分析
1.编译器的结构
重要的系统软件:
1.识别符合语法和非法的程序。
2.生成正确且高效的代码。
分析部分(前端front end):
1.词法分析,生成词素(lexeme)。
2.语法分析,生成语法树。
3.语义分析,收集类型信息,进行语义检查。
4.中间代码生成,生成intermediate representation (IR)。
综合部分(后端back end)
1.代码优化,机器无关优化,生成优化后的IR。
2.代码生成,生成目标代码。
2.静态分析
静态分析:不执行程序代码,推导程序的行为,分析程序的性质。
控制流(Control flow):程序执行的流程。
数据流(Data flow):数据在控制流上的传递。
通过分析控制流和数据流,可以知道更多关于程序的性质,根据这些性质优化代码。
3.过程内分析和过程间分析
过程内分析(Intra-procedural analysis):仅在过程内部进行分析。
过程间分析(Inter-procedural analysis):考虑过程调用时参数传递和返回值的数据流和控制流。
go编译器优化
为什么做编译器优化:
1.用户无感知。重新编译即可获得性能收益。
2.通用性优化
现状:采用的优化少,编译时间较短,没有进行较复杂的代码分析和优化。
编译优化的思路:
场景:面向后端长期执行任务。
Tradeoff:用编译时间换取更高效的机器码。
Beast mode:
1.函数内联:将被调用函数的函数体(callee)的副本替换到调用位置(caller)上,同时重写代码以反映参数的绑定。
2.逃逸分析:分析代码中指针的动态作用域:指针在何处可以被访问。
3.默认栈大小调整
4.边界检查消除。
5.循环展开。