Compilers provide you with the theoretical and practical knowledge that is needed to implement a programming language. Once you learn to do compiler, you pretty much know the innards of many programming languages. Moreover, judging a programming language by its essential features will become easy for you. We are going to cover all the phases of a compiler such as lexical analysis, syntax analysis, intermediate code generation, code optimization, and symbol table in detail.