Anyway, the most difficult part of writing the compiler was probably the garbage collector.
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.
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.
[1]: Btw, if LLVM compile times are getting to you, Use. Ccache. It is amazeballs.