go语言学习9 | 青训营笔记

112 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的的第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.循环展开。