Agree.
You might find some anti-C bias from my post history, but I am also very pragmatic and would certainly use C if required to do so.
I used the compilation to bytecode disguised as Assembler macros as part of a few toy compilers back in late 90's.
If it was today I would probably use LLVM or C(++) as being discussed in the article.
When compiling dynamic languages of course, that often doesn't work as the optimiser doesn't have anything to go on if you do everything through void* pointers, or a similar dynamic construct.