- ease of iteration and freedom to make huge breaking changes (and they did make use of it, see e.g. various generations of the GC, or the SSA work);
- thorough knowledge of the internals of the compiler they used (given they were it's authors; also this is linked to the reason I listed above);
- one of the explicit goals for the Go toolchain was that it must compile very fast (which I believe is also somewhat at odds with advanced optimizations, like those used in LLVM) - they even quipped something like "we designed Go while waiting for C++ to compile";
- additionally, though I'm not sure if it was ever spelled explicitly, I suppose they wouldn't want to get tied to the LLVM as a huge dependency, including having to adjust to each and every change in LLVM API, regardless if sensible or not (I seem to recall from so me articles that LLVM does introduce breaking changes in API from time to time?);
[1] https://golang.org/doc/faq#What_compiler_technology_is_used_...
And the fact that the first people working on Go have a good knowledge of the Plan9 toolchain probably gave them a head start. But that benefit has probably eroded long ago.
And I completely disagree with the Go team's emphasis on compile times. Fast result programs are far more important than fast compile times. Fast compile times are nice to have, but not much more than that. But this is just my opinion, it's as good as anyone else's.
Fast compile times also let you run your test suite every time you hit ctrl + s.
Fast compile times also let you run tools like gomft without feeling like it is slowing you down.
I agree that fast programs are essential and (ideally) not mutually exclusive with fast compile times.
They are. It is always a tradeoff.
You can configure the optimization level to 0, then only constant folding is performed when the IR is built, and nothing else is done.
Anyway, the most difficult part of writing the compiler was probably the garbage collector.
It was done for implementation speed. They had a compiler backend which they, the early Go team, were all familiar with. It was small so they could quickly change it to suit Go, rather than the other way around.
Russ Cox expressed the sentiment that if they had tried to use LLVM there would have been a lot of up front work that would have taken a long time and the Go project probably would have fizzled out. Using the plan 9 tool chain they were up and running very quickly allowing them to focus on the most important work, designing the language itself.
(Probably shouldn't attribute this to Russ Cox, I've probably read into his (rather briefer than what I wrote above) comments)
In my opinion this was the right choice. If LLVM turns out to be the best backend for Go it's easy to use it later. However, the language itself is largely fixed after 1.0. Better to focus on the language than the compiler backend which can be swapped out later.
Depending on C++ code and keep alive the belief that you can only create compilers in C and C++?
As many without experience in compiler development think.
Also, and this is specially painful when compiling Rust or Swift from source, saving themselves the pain of waiting around 4h for a clean compile.
I can assure you it really does take 4 hours.
And to bring the point home, I can link you to the Swift issue where I was discussing this matter.
[1]: Btw, if LLVM compile times are getting to you, Use. Ccache. It is amazeballs.
Also I never had 4h builds with single core processors back when I was working full time with C++. The slowest ones were around 2h.
A core duo would run circles around those computer systems, hence my dismay how much hardware LLVM requires for building.
Also that is surely a side effect how they are using C++, which desperately needs modules.
I've been wondering about this ever since Go came out. If I recall correctly, LLVM was already a viable option back then.
The latest release of Go earlier this week featured a pretty big revamp of their backend with a new SSA-based middle/backend. I wonder how much work went into that and could they have achieved that faster had they been on LLVM since day 1.