The document defines and describes compilers and their key phases and components. A compiler translates a high-level language into machine-level language. It has two main phases - analysis and synthesis. The analysis phase performs lexical, syntax and semantic analysis to generate an intermediate representation. The synthesis phase generates code from this representation, including intermediate code, optimization, and final code generation. Compilers have a front-end, middle-end and back-end. The output can be for native or cross platforms, or target a virtual machine. Compiler correctness and related techniques like assemblers are also discussed.