研究一门编程语言的实现原理,第一步就是要在自己的计算机上,通过源码成功编译出适应本系统的安装包(也叫源码安装)。
一言以蔽之
在 M2 芯片的 Mac 上编译最新的 Golang。
环境信息
- 目标 Golang 源码分支:
master - 操作系统:macOS
- 芯片架构:Apple M2 Pro
为什么要从源码编译
在研究语言实现过程中,我们不可避免要进行 Debug、打印日志甚至修改某些实现逻辑,如果直接使用编译好的 Golang 环境,源码不可修改。
自举
在开始编译我们自己的 Go 版本之前,先来看一个问题:我们日常开发 Go 程序,只需要编写一个 xxx.go 文件,然后使用 Go 提供的编译命令 go build xxx.go 就可以编译出本平台的可执行文件进而运行。
之所以能愉快的使用 go 命令,本质上是我们在本地电脑安装了 Go 的包(环境),执行 go build 命令实际上是调用了 Go 的编译器将我们的代码编译成了可执行文件。
那么思考这个问题:Golang 的编译器是由什么语言实现的呢?查看 Github 上 Go 的开源仓库我们知道,目前的 Go 编译器,是 Go 实现的。
Go 自己编译自己?很明显这陷入了 “先有鸡还是先有蛋” 的问题。不过这个问题在这里有明确的答案 —— 自举。
什么是自举?通俗来讲,实现编程语言的自举,就是能使用该语言本身编写的编译器或解释器来编译或运行该语言程序的过程。以 Go 为例,自举的大致过程如下:
- 实现前端编译器:使用 C 语言实现并编译 Go 的基础编译器(gc,go compiler,和垃圾收集的 GC 不是一回事),功能相对有限。


1226

被折叠的 条评论
为什么被折叠?



