Introduction to the main concepts of program analysis such as intermediate representations, inter-procedural and intra-procedural analysis techniques, call graphs, pointer analysis, and analysis frameworks. The course will also include relevant research papers that introduce both classical and state-of-the-art research in the field. The course will give an overview of the program analyses that work and those that do not work in practice and how to design program analyses for modern software systems. Prerequisites: CMPUT 201 or 275, and CMPUT 272. Knowledge of grammars and automata, regular expressions, and finite state machines is recommended.