Usually you have to use C when a large runtime (GC, rich standard library) is going to cause a problem. One common case of that is when you're making a least common denominator library that would be called by multiple higher-level languages. Other cases are embedded systems or when you need to micro-optimize.<p>That's why I think Rust is promising because "no GC" is often a reason to use C. You don't want two GC's that can see the same objects (unless you like leaks) so if you're writing code to be exported up into higher level languages, you don't want a language with GC.