FWIW, Rustc not having multiple implementations is exactly the reason why I'm not looking into it for serious projects (1). OTOH, JavaScript being ubiquitous is the reason I can spend time on projects with a certain depth and commitment (though JavaScript ES6+ isn't nearly as ubiquitous as it was until ES5, with only two major implementations left), knowing that a multi-year development effort isn't torpedoed by language churn.
1) and I personally don't believe in a "one language to rule them all" behemoth but rather in small, focused languages and tools in a polyglot/Unix fashion
There are at least two e2e implementations of Rust:
- rustc, the reference implementation.
- mrustc, an alternative written in C++ [1].
There are also multiple implementations Rust's IR (MIR):
- rustc compiles MIR to LLVM.
- A backend that compiles MIR to Cranelift [2].
- Miri, a MIR interpreter used for dynamic analysis [3].
mrustc doesn't perform the borrow check, so it can't prevent you from triggering UB like rustc. But you can use rustc for the borrow check and mrustc for codegen.
[1]: https://github.com/thepowersgang/mrustc