directly compiler is necessary.
No it is not... By compiling to C and then having the "actual" compiler turn that C code to system code, it has several advantages. One of those is simply: You use all the optimizations that are present in the used compiler to gain more speed.
Take a look here ... https://github.com/kostya/benchmarks
Notice how in a lot of case GoLang is slower usage despite the code being run on the same compiler ( and at times more memory usage ). Rust keeps up with Nim but does so again by using more memory. Nim's weakest results are the json decoding ( still a lot better then in the past ).
By compiling to C, Araq can write the nim-c code to more optimized. So for instance the g++ compiler can extract more speed.
Think of it as a pre-compiler / optimizer. Its not like this step slows down compile time. If we see how much GoLang has slowed over time ( think 1.6 is something like 3 times slower to compile compared to 1.3 ). Think Nim now is even way faster then the latest Golang for compiling.
It may sound illogical to have something compile multiple times but because you control the steps in between, its possible to add optimizations that are normally much harder to do ( as we do not control the gcc etc compilers development ).
Lets see ... Golang = multiple full time developers, backing of major company, simpler language and it gets its behind still kicked by a technically one person, who developed in his free time development team. ;)
Imagine when Araq can work full time on the code or has several other full time developers to back him up.