A compiler translates a program written in a high level language into a program written in a lower level language. For students of computer science building a compiler from scratch is a rite of passage: a challenging and fun project that offers insight into many different aspects of computer science some deeply theoretical and others highly practical. This book offers a one semester introduction into compiler construction enabling the reader to build a simple compiler that accepts a C-like language and translates it into working X86 or ARM assembly language. It is most suitable for undergraduate students who have some experience programming in C and have taken courses in data structures and computer architecture.