This course will provide students with a solid foundation of the syntax, semantics, and pragmatics of the full range of programming languages. This course is an introduction to the theory, design, and implementation of programming languages. Topics covered in this course include: formal semantics of programming languages, type systems, higher-order functions and lambda calculus, laziness, continuations, dynamic types, monads, objects, modules, concurrency, and communication