# 6.2 代码结构

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

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

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

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

    // 忽略不相关代码

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

    // 忽略之后代码
}
```

&#x20;处理初始化任务的代码位于包 `pkginit` 与 `staticinit` 中，总共涉及到三个文件：

* `cmd/compile/internal/pkginit/init.go` \
  处理初始化代码的主逻辑，即上面代码中的函数 `pkginit.Task()` 即在该文件中
* `cmd/compile/internal/pkginit/initorder.go` \
  处理全局变量赋值语句，根据其相互关系确定初始化顺序
* `cmd/compile/internal/staticinit/sched.go` \
  判断赋值语句是动态执行（运行时）还是静态执行（编译时），如果是后者则完成初始化操作
