1. Lexical Analysis - read source code and split it into tokens. 2. Syntax Analysis - receive tokens and produce a hierarchical structure called syntax tree. 3. Semantic Analysis - take syntax tree and check whether the given program is semantically consistent with language definition. 4. Intermediate Code Generation - translate source code into an independent intermediate code. 5. Code Optimization - optimize the intermediate code without changing the meaning of the program. 6. Target Code Generation - convert optimized intermediate code into a form that can be executed on a target machine (e.g. machine code).