Go语言编译器的正确打开方式(一)- 从源码编译 go

写在前面

为什么实操编译器?

学习现代编译器原理时,你是否曾感到困惑?

书籍和文章虽然众多,但缺乏一个直观的例子来帮助理解。就像给了说明书却没有实际产品一样,让人一头雾水。

本系列给你递个梯子,带你一步步实际操作揭开Go语言编译器的神秘面纱。

即使没有很多编译器的知识,也可以阅读本系列。

为什么选择Go语言的编译器?

Go语言编译器是一个教科书般的实现。

不仅 Go 语言的编译器完全用 Go 语言本身来实现,链接器也是用Go语言写的。

而且Go 编译器里基本上使用的都是经典的算法。

更重要的是它提供了非常直观的工具将整个编译过程呈现给你。

相信有了Go语言的编译器做辅助,你对编译原理会有更深入的了解。

准备:从源码编译 go

Go语言的流行使得越来越多的人对它的感兴趣。

从源码编译是方便我们后续Debug调试跟踪Go源码。

具体步骤可以参考 go.dev/doc/install...

下载源码

clone go的代码到本地, 源码地址在github.com/golang/go.g...

bash 复制代码
git clone https://github.com/golang/go.git

选择合适的Go版本

接下来,我们需要选择一个特定的Go版本进行编译,这里以 go1.21.11 版本为例

bash 复制代码
git checkout go1.21.11

编译

注意从源码编译go所要求的最低版本

The minimum version of Go required depends on the target version of Go:

  • Go <= 1.4: a C toolchain.
  • 1.5 <= Go <= 1.19: a Go 1.4 compiler.
  • 1.20 <= Go <= 1.21: a Go 1.17 compiler.
  • 1.22 <= Go <= 1.23: a Go 1.20 compiler.
  • Going forward, Go version 1.N will require a Go 1.M compiler, where M is N-2 rounded down to an even number. Example: Go 1.24 and 1.25 require Go 1.22.

然后执行src目录下的all.bash

Building Go cmd/dist using /opt/golang/go1.21.11. (go1.21.11 darwin/arm64) Building Go toolchain1 using /opt/golang/go1.21.11. Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1. Building Go toolchain2 using go_bootstrap and Go toolchain1. Building Go toolchain3 using go_bootstrap and Go toolchain2. Building packages and commands for darwin/arm64.

执行完成后,会生在bin目录下生成gogofmt两个可执行文件,当前go目录可以做为GOROOT使用。

相关推荐
我才是银古2 小时前
基于 robotgo 实现 Windows 桌面 RPA 自动化框架:技术全解
go·rpa·robotgo
爱好曙光4 小时前
Go GMP调度器调优:CPU绑定与goroutine饥饿实战
性能优化·go·并发编程
景威9 小时前
写了个零依赖的 Go 版本管理器,curl | bash 完事,支持自动回退国内镜像
go
cocoCola916679 小时前
Go语言操作Redis
go
名字还没想好☜1 天前
Go 并发实战:用 channel 实现 worker pool
java·数据库·后端·golang·go
星航夜空的帆舟2 天前
ADK 会话与状态管理:三级状态、内存服务与多存储后端
go·agent
CodeStats2 天前
【编程语言】深度梳理C/C++、Java、Python、Go、Rust的区别
java·linux·c语言·c++·python·rust·go
用户6757049885022 天前
Go 程序员进阶必读:这 24 个经典的 Golang 错误,连老手都会栽跟头!
后端·go
大P哥阿豪2 天前
Go panic & recover:深入Go语言的异常拯救之道
开发语言·后端·golang·go
星航夜空的帆舟3 天前
ADK 模型抽象与多模型集成:从 Gemini 到 Ollama
go·agent