6.2 代码结构

在编译器主函数内,处理初始化任务的代码紧跟着语法分析与类型检查之后,其代码片段如下:

// file: cmd/compile/internal/gc/main.go

func Main() {
    // 忽略之前代码

    // 语法分析与类型检查
    noder.LoadPackage(flag.Args())

    // 忽略不相关代码

    // 处理初始化任务
    if initTask := pkginit.Task(); initTask != nil {
        typecheck.Export(initTask)
    }

    // 忽略之后代码
}

处理初始化任务的代码位于包 pkginitstaticinit 中,总共涉及到三个文件:

  • cmd/compile/internal/pkginit/init.go 处理初始化代码的主逻辑,即上面代码中的函数 pkginit.Task() 即在该文件中

  • cmd/compile/internal/pkginit/initorder.go 处理全局变量赋值语句,根据其相互关系确定初始化顺序

  • cmd/compile/internal/staticinit/sched.go 判断赋值语句是动态执行(运行时)还是静态执行(编译时),如果是后者则完成初始化操作

最后更新于