Prerequisites: Familiarity with an imperative programming language (e.g., C), an undergraduate or graduate compilers course, and an undergraduate or graduate data structures/algorithms course. This course covers topics in programming languages and compilers such as: LL(1) and LR parsing techniques with error handling; attribute grammars and their use in syntax-directed translation; type systems and polymorphism; models of programming language semantics (i.e., operational semantics through closure interpreters ); data abstraction; functional, logical, and object-oriented paradigms; intermediate representations of programs; examples of novel programming models for cyber-physical systems; parallel programming models; automatic parallelization.