Program analysis is the foundation for most modern software tools, such as compilers, bug checkers, just-in-time optimisers, refactoring engines, and IDEs. In this course we will explore three central program analysis techniques: type inference, dataflow analysis, and dynamic program analysis.