Both turn high-level code into something the computer runs, so I can't describe what actually separates them.
Accepted answer
Both are **translators** from high-level code to machine code. The difference is *when* and *how much*.
**Compiler** — translates the **whole program at once**, producing an executable file. Translation happens once; after that it runs without the compiler. Execution is fast, and the finished program can be distributed without the source. But you get all the errors in one list at the end, and the executable only runs on the platform it was compiled for.
**Interpreter** — translates and executes **one statement at a time**, every run. It stops at the first error, which makes debugging much easier, and the same source runs anywhere an interpreter exists. But it's slower (translation repeats every time) and the interpreter must be present to run the program.
Hence the usual pairing: interpreters during **development** for quick error-by-error feedback, compilers for **release**.
A third to know: an **assembler** translates assembly language into machine code, one instruction to one instruction.