Rust ships as a small toolbox, not a single binary. Three names do almost all the work, and knowing which is which saves you a lot of confusion.
rustup — the version manager
rustup installs and switches Rust toolchains. Think of it as nvm for Node or pyenv for Python. It manages which compiler version you're on, which release channel (stable, beta, nightly) you use, and which compile targets you have installed (so you can cross-compile for ARM, WebAssembly, and friends).
rustc — the actual compiler
rustc is the program that turns .rs source into a binary. You almost never call it by hand — it has no notion of dependencies or project layout. It compiles files. That's it. The one time you'll reach for it directly is rustc --explain E0382, which prints a full essay on any error code.
cargo — the one you actually use
cargo is the front door. It wraps rustc, resolves dependencies from crates.io, runs your tests, builds your docs, and understands project structure. Ninety-five percent of your Rust life is cargo subcommands: cargo new, cargo run, cargo build, cargo test, cargo check.
cargo check is your fastest friend. It type-checks and borrow-checks your whole project without producing a binary — far faster than a full cargo build. Run it constantly while you work; save the full build for when you actually need to run something.Release channels & editions
Rust ships a new stable release every six weeks — small, backward-compatible, never scary. nightly exists for unstable experimental features behind feature flags. Separately, the edition (2015 / 2018 / 2021 / 2024) in your Cargo.toml picks which language idioms a crate uses. A new compiler still compiles old editions, so upgrading your toolchain never breaks old code — and adopting a new edition is your deliberate, per-crate choice. (Cinder's native core, for instance, runs on edition 2021 even though 2024 is out — editions are opt-in, not a treadmill.)