Go编译过程
2024-09-08 09:39:35
一、 Go编译流程
二、过程说明
1. 词法解析
读取Go源文件,将字符序列转换为符号(token)序列,比如将“:=”转换为_Define
代码中的标识符、关键字、运算符和分隔符等字符串都将转化为对应的符号
2. 语法解析
根据Go语言规范对符号化的Go源文件进行解析,识别可能出现的语法错误,比如
1 package main
2
3 import "fmt"
4
5 func main()
6 { //这里不能单独一行
7 fmt.Println("Hello world!")
8 }
9
10 # command-line-arguments
11 ./main.go:5:6: missing function body
12 ./main.go:6:1: syntax error: unexpected semicolon or newline before {
3. AST构建
AST,即抽象语法树(Abstract Syntax Tree)
4. 类型检查
a. 类型推断
b. 数组索引是否为正整数
c. 引用的结构体字段是否是大写可导出的
5. 变量捕获
主要针对闭包场景而言,闭包函数可能引用闭包外变量
变量捕获需要明确在闭包中通过值引用还是地址引用来捕获变量
6. 函数内联
函数内联是指将较小的函数直接组合进调用者的函数内
可以减少函数调用的开销
7. 逃逸分析
逃逸分析确定变量内存是分配在栈区还是堆区
8. 闭包重写
对闭包函数进行重写
9. 遍历函数
遍历函数中的声明和表达式,将操作函数替换为具体的执行函数,如map被替换为运行时mapaccess2_fast64函数
10. SSA生成
SSA,即静态单赋值(Static Single Assignment),可以理解为抽象语法树到机器码的中间代码
11. 机器码生成
a. 汇编
b. 链接
三、可执行文件
1. ELF
ELF,Executable and Linkable Format是类Unix操作系统下最常见的可执行且可链接的文件格式。
最新文章
- 关于TextView的setText()与Integer之间一个易犯的小错误
- codeforces 697B Barnicle
- Asp.Net在多线程环境下的状态存储问题
- Oracle EM 不能访问
- x86, x86-64, i386, IA32, IA64...
- Effective C++_笔记_条款11_在operator=中处理“自我赋值”
- linux下的watch命令
- wpf listview 行变色
- Java获取某年某周的第一天
- HTML的水平居中和垂直居中解决方案
- delphi弹出信息框大全
- SSL证书安装(Tomcat)腾讯云服务器
- C - Heavy Transportation &;&; B - Frogger(迪杰斯变形)
- P2947 [USACO09MAR]向右看齐Look Up--单调栈
- Linux 典型应用之远程连接SSH
- Linux成为云计算平台的主流操作系统
- Git系列①之仓库管理互联网托管平台github.com的使用
- spring ioc beanfactory 关系图
- sessionStorage 、localStorage、cookie
- TNS-12518,TNS-12536,TNS-00506,Linux Error: 11: Resource temporarily unavailable