This document defines and describes compilers. It discusses that a compiler translates high-level programming languages into machine-level languages. The compiler process involves two main phases - analysis and synthesis. The analysis phase breaks down the source code and generates an intermediate representation through lexical, syntax and semantic analysis. The synthesis phase then generates target code from the intermediate representation, optimizing and outputting assembly code. The document also outlines the typical structure of a compiler into front-end, middle-end and back-end components and discusses native compilers, cross compilers and virtual machines.