go语言编译过程概述

go语言编译过程概述

《Go语言设计与实现》总结

术语解释:

图片[1]-go语言编译过程概述-唐朝资源网

流程概览

词法和句法分析

词法分析会返回一个不包含空格、换行符等的Token序列,例如: , json, , (, io, ) , …,解析会将Token序列转换成有意义的结构,即语法树。

类型检查

在得到一组文件的抽象语法树后,Go语言的编译器会检查语法树中定义和使用的类型。以下序列分别验证和处理不同类型的节点:

图片[2]-go语言编译过程概述-唐朝资源网

常量、类型、函数名和类型;变量赋值和初始化;函数体和闭包;哈希键值对的类型;导入函数体;外部声明;

通过遍历整个抽象语法树(同时也修改语法树),我们会在每个节点验证当前子树的类型,保证节点没有类型错误,所有类型错误和不匹配都会暴露出来在这个阶段,包括:通过结构实现接口。

类型检查阶段不仅验证节点类型,还扩展和重写了一些内置函数。例如,make 关键字将被替换为 .或者 。等根据这个阶段的子树的结构。功能。

中间代码生成

当我们将源文件转换成抽象语法树,解析整棵树的语法,并进行类型检查时,可以认为当前文件中的代码没有语法错误和类型错误,而Go 语言的编译器会将输入的抽象语法树转换为中间代码。

经过类型检查后,编译器会通过cmd///编译整个Go语言项目中的所有函数。这些函数会在一个编译队列中等待多次消费,并发执行会将所有函数对应的抽象语法树转化为中间代码。由于Go语言编译器的中间代码使用了SSA的特性,现阶段我们可以分析代码中无用的变量和片段,优化代码

机器代码生成

Go语言源码的src/cmd//目录下包含了很多机器码生成相关的包。不同类型的CPU使用不同的包生成机器码,包括amd64、arm、arm64、mips、ppc64、s390x、x86和wasm

© 版权声明
THE END
喜欢就支持一下吧
点赞14赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容