自展(Bootstrapping)

用Go语言实现的Go的编译器,从一开始就要考虑如何自展。我们考虑的规则就是Go1.3编译器必须由Go1.2编译,Go1.4的编译器必须由Go1.4编译,以此类推。

这时,我们就有了一个清晰的流程来生成当前的程序:编译Go1.2的工具链(由C编写),然后使用它编译Go1.3的工具链,以此类推。这里需要一个脚本来做这个事情,来保证只会消耗CPU的时间而非某个人的时间。这样的自展,每个机器只会做一次,Go1.x的工具链将会在本地保留,并在执行all.bash来编译Go1.(x+1)工具链的时候被再次使用。

显然,随着时间的推移这种自举方式是不充分的。在后面的多个版本被发布之前,为编译器写一个后端来生成C代码也许是一个更有意义的事情。这些C代码不要求效率或可读性,只要正确即可。这些C代码将会被签入,就像我们签入由yacc生成的y.tab.c文件一样。这样,自展过程就会变成:先用gcc编译C代码生成一个自展编译器,然后使用这个自展编译器来编译真正的编译器。类似于另一个自展过程,这个自展编译器将会在本地保留,并在每次执行all.bash的时候重复使用(不用重新编译)。