This course surveys concepts, constructs, and foundations of a variety of programming languages. Main topics are lambda-calculi, type systems, data and procedural abstraction, programming paradigms (object-oriented, functional, and logic), and formal semantics (denotational, operational and axiomatic). Languages of interest include C, C++, Java, Lisp, ML, Smalltalk, and Prolog. Programming projects are designed to deepen understanding of languages. Language-specific details are covered in the recitations which are closely coordinated with the lectures.