The components of a compiler appear in every software application that handles input from an external source. This course shows how the components of a compiler are built and how they fit together to extract meaning from the input information. It shows how the data flows through the components to become useful to applications containing the compiler’s components. Students will learn to use the LLVM tools to build a compiler that can produce machine code to target almost any platform including the Java Virtual Machine. By the end of the course, students will have developed a complete compiler that can do this for a subset of the C++ programming language.