In software engineering, we often hear terms like “stability,” but context is everything. There's a subtle yet important distinction between language stability and program stability, and confusing the two leads to flawed arguments, misguided tool choices, and bad engineering tradeoffs.
Tools like valgrind, sanitizers, fuzzers, and even type systems can help catch bugs within the program, regardless of what language it’s written in.
Language stability, on the other hand, is about the evolution of the language itself — its specification, standard library, syntax, and semantic guarantees. It’s about whether:
This conflates program-level safety with language-level stability. C is unstable at runtime if misused, yes — but as a language, C is extremely stable. Rust is safer for the programmer, but you still need to track evolving idioms, compiler versions, and crates.
But when those two diverge, be clear about what you're optimizing for. Not all breakage is caused by the language. And not all language guarantees will save you from writing unstable code.