Go程序编译过程(自己梳理的笔记)

本文详细介绍了Go程序的编译过程,从词法语法分析、类型检查和AST转换,到SSA优化和降级转换,再到汇编器生成机器码,最后通过链接形成可执行程序。重点讨论了Go编译器如何将源码转化为SSA形式,并优化处理,为理解Go编译原理提供了深入洞察。
摘要由CSDN通过智能技术生成

概述

Go源码程序首先经过go编译器生成plan9汇编,再由汇编器和链接处理得到最终的可执行程序。go编译过程

编译器

编译器对go源码的处理过程主要包含以下三个过程:词法语法分析、类型检查和AST转换、SSA优化和降级转换,最终go源码生成对应的plan9汇编。
编译器处理过程

Go程序的编译入口是 compile/internal/gc/main.go文件的Main函数,Main函数获取命令行参数并更新编译选项和配置,
然后运行parseFiles函数对输入的所有文件进行词法和语法分析,得到对应的AST抽象语法树。这是编译的第一个阶段。

func Main(archInit func(*Arch)) {
   
    // 获取命令行参数、更新编译器选项和配置
	...
    
	timings.Start("fe", "parse")
	lines := parseFiles(flag.Args()) // 词法语法解析go文件,得到AST
	timings.Stop()

	// 处理AST,类型检查、AST转换、编译等
	...
}

词法语法分析

词法分析:分析go源代码文本,将文本中的字符序列转换为标记序列。 比如说go源码中的关键字package 会转换为 _package 标记,func转换为_func标记,(转换为 _Lparen标记 等等

compile/internal/syntax/tokens.go 文件定义了Go语言支持的的全部token类型,
比如说名称和文本、操作符、定界符、关键字等,下面列出了部分token对应关系。

const (
	_    token = iota
	_EOF       // EOF

	// names and literals
	_Name    // name
	_Literal // literal

	// operators and operations
	// _Operator is excluding '*' (_Star)
	_Operator // op
	...

	// delimiters
	_Lparen    // (
	_Lbrack    // [
	_Lbrace    // { 
	...

	// keywords
	_Break       // break
	_Case        // case
	_Chan        // chan
    ...

	// empty line comment to exclude it from .String
	tokenCount //
)

compile/internal/syntax/scanner.go 文件实现了词法解析器主要部分,
使用scanner结构体的next方法实现go文件的扫描并转换为token序列,next方法获取文件中未被解析的字符,进入switch/case分支进行词法解析。scanner结构和next主体代码如下:

// scanner 结构体
type scanner struct {
   
	source // 数据源文件
	mode   uint
	nlsemi bool // if set '\n' and EOF translate to ';'

	// current token, valid after calling next()
	line, col uint
	tok       token 
	lit       string   // valid if tok is _Name, _Literal, or _Semi ("semicolon", "newline", or "EOF")
	kind      LitKind  // valid if tok is _Literal
	op        Operator // valid if tok is _Operator, _AssignOp, or _IncOp
	prec      int      // valid if tok is _Operator, _AssignOp, or _IncOp
}

// 扫描转换文本为token序列
func (s *scanner) next() {
   
	nlsemi := s.nlsemi
	s.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值