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

The multiple implementation story of Rust isn't as great as some older languages, but it's getting there.

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

[2]: https://github.com/bjorn3/rustc_codegen_cranelift

[3]: https://github.com/rust-lang/miri