Study of programming paradigms: functional, imperative, concurrent, and probabilistic programming. Mathematical foundations: inductive definitions, fixed points, and formal semantics. Models of programming languages including the lambda calculus. Type systems, polymorphism, modules, and object-oriented constructs. Program transformations, program logic, and applications to programming methodology.