This class is an advanced undergraduate course on the principles of programming languages. We will study the foundations of different programming language paradigms from a design and implementation perspective. The topics we will study include: functional programming, lambda calculus, logic programming, type systems, Floyd-Hoare logic, object-oriented programming, and program verification.