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).