Go程序如何编译

Go程序如何编译

1
2
3
4
5
6
7
package main
import "fmt"

func main()
{
fmt.Println("hello world")
}

go build -n

编译过程

image-20221217102250779

词法分析

  • 将源码翻译成Token
  • Token是代码中最小的语义结构

句法分析

  • Token序列经过处理,变成语法树(SST)

    image-20221217102634690

语义分析

  • 类型检查
  • 类型推断
  • 查看类型是否匹配
  • 函数调用内联
  • 逃逸分析

中间码生成

  • 为了处理不同平台的差异,先生成中间代码(SSA)
  • 查看从代码到SSA中间码的整个过程
1
2
3
$env:GOSSAFUNG="main"
export GOSSAFUNC=main
go build

image-20221217103726909

机器码生成

  • 生成Plan9汇编代码

  • 最后编译为机器码

  • 输出的机器码为.a文件

  • 查看Plan9汇编代码

    1
    go build -gcflags -S main.go

链接

  • 将各个包进行链接,包括runtime

Go程序如何编译
http://example.com/2022/12/17/Go程序如何编译/
Author
WYX
Posted on
December 17, 2022
Licensed under