Long Step Of Building Go Compiler

When building golang compiler binary from source code, I got the following output:

Building Go cmd/dist using /home/jauhararifin/.gvm/gos/go1.21. (go1.21.0 linux/amd64)
Building Go toolchain1 using /home/jauhararifin/.gvm/gos/go1.21.
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 linux/amd64.

It looks like, there is a very long step of process just to build a single go binary. First it build some kind of binary called dist using previous version of Go. And then it builds toolchain1 using previous version of Go, and used that to build go, and then used that go to rebuild itself, and rebuild itself once again. And then, it is used to rebuild itself once again.

I’m not sure if that what it does, but does anyone know why there is such a complicated process? Why not just simply use previous Go to build the current Go?

I want to learn about Golang compiler by putting a bunch of print statement in the source code, but rebuilding it is so slow. I’m wondering why, and what can I do about it.