Apart from providing a theoretical background, the aim of Compiler Design Lab is a thorough introduction to compiler design. The Student will be building several complete end-to-end compilers for successively more complex languages. He should know how a compiler works in some depth. In particular, he should understand the structure of a compiler, and how the source and target languages influence various choices in its design. It will give him a new appreciation for programming language features and the implementation challenges they pose, as well as for the actual hardware architecture and the runtime system in which his generated code executes. Understanding the details of typical compilation models will also make him a more discerning programmer. He will also understand some specific components of compiler technology, such as lexical analysis, grammars and parsing, type-checking, intermediate representations, static analysis, common optimizations, instruction selection, register allocation, code generation, and runtime organization. The knowledge gained should be broad enough that if he is confronted with the task of contributing to the implementation of a real compiler in the field, he should be able to do so confidently and quickly.