Compiler
Translates entire source code to machine code before execution
Produces a standalone executable — no translator needed to run
All syntax errors reported together after full translation
Resulting code runs faster (already machine code)
Translation takes time — longer build cycle
Used by: C, C++, Rust, Go, Pascal
Interpreter
Translates and executes source code one statement at a time
Translator must be present every time the program runs
Stops at first error — easier to debug interactively
Slower execution — re-translates on every run
Easier to develop and test code iteratively
Used by: Python, JavaScript, Ruby, PHP (traditional)