I&#x27;ve actually done both.<p>The LLVM API is good, yes, but from a project management point of view it&#x27;s pretty painful to work with --- the libraries are vast, don&#x27;t have stable binary interfaces, and don&#x27;t validate parameters, which means that if you get anything wrong it tends to just segfault deep inside somewhere. I&#x27;ve had to single step through the LLVM source code way too many times.<p>Plus, distribution support has always been pretty poor. e.g. Debian&#x27;s 3.3 package&#x27;s llvm-config tries to link your program against the <i>static</i> libraries rather than the dynamic ones, which leads to painfully large link times.<p>This all adds up to a non-trivial cost.<p>By contrast, emitting C is a lot less powerful, but suddenly you don&#x27;t have to care about any of this stuff. You have a standardised intermediate format which you can throw at any compiler, which is trivially verifiable, doesn&#x27;t need special libraries to write, and easily integrates into third-party tool chains. Simply having rigorously separated front and back ends can be a huge win. But biggest of all, you don&#x27;t have to keep knowledge of the LLVM API in your brain while you&#x27;re trying to get work done.<p>Of course, you don&#x27;t get proper debugging information, or tail calls, or any of the other things you can do with the LLVM API which you can&#x27;t do through C; but depending on what you want to do, it can totally be worth it.