This course introduces concepts related to the specification and design of high-level programming languages. It discusses different programming paradigms, algebraic specification and implementation of data types, and develops interpreters in Scheme for specifying operationally the various programming language features/constructs (spanning simple expression language to class-based object-oriented language). It also introduces attribute grammar framework that is convenient for automatic translation and axiomatic semantics formalism that assists in program verification. The programming assignments will be coded in Scheme using Racket IDE