compiled vs interpreted
Your code is written for humans, but the machine only runs its own low-level instructions — so something has to translate. There are two broad ways to do it, and the difference shapes how you build, ship, and debug.
A compiled language (like C or Rust) translates the whole program up front, all at once, into a standalone machine-runnable file before it ever runs. It's a separate 'build' step — slower to start, but the finished program tends to run fast, and many mistakes get caught at compile time.
An interpreted language (like Python or JavaScript) translates and runs line by line, on the spot, as the program executes. There's no build step, so you can edit and re-run instantly — lovely for tinkering — but errors tend to surface only when that line actually runs.
In practice the line is blurry: many modern languages compile to an in-between 'bytecode' and use clever tricks. But the mental model still holds — translate-everything-first, or translate-as-you-go.
# Compiled: build once, then run the binary $ rustc hello.rs && ./hello # Interpreted: no build step, just run the source $ python hello.py
Compiled languages build first, then run; interpreted ones run the source directly.
Rough rule of thumb: compiled trades startup time for speed; interpreted trades speed for instant feedback.