1. Objectives: This course will study the design and implementation of programming languages from a foundational perspective. 2. Course contents: Introduction to Scheme, Java compiler compiler, visitor pattern, Java tree builder. Program semantics: denotational semantics, operational semantics, small step semantics, big step semantics, axiomatic semantics (Hoare logic), equivalence. Type systems: type soundness, normal form, progress, type preservation, simply typed lambda-calculus, records, polymorphism, inheritance, decision procedure for subtyping, covariance and contra variance, type inference, principal types, typed assembly languages, system F. Type inference: Hindley-Milner's type inference algorithm for functional programs, subset-based and unification-based type inference for imperative programs. Continuation Passing Style (CPS), and closure conversion, control flow analysis, control exceptions and versioning exceptions, exceptions and parallel languages, partial evaluation. 3. Text Books: 1. Essentials of Programming Languages (EOPL), Daniel P. Friedman, Mitchell Wand, and Christopher T. Haynes, McGraw-Hill, 2001. 2. Types and Programming Languages, Benjamin C. Pierce, MIT Press, 2002. 4. References: 1. Foundations of Programming Languages, John Mitchell, MIT Press, 1996. 2. Practical Foundations of Programming Languages, Robert Harper, 2011, online book.