Why are there so many programming languages and how do they differ? What is an appropriate programming paradigm to solve a particular task? In this course, we will learn about common programming paradigms, such as object-oriented programming, functional programming, and logic programming, while using different languages that demonstrate these paradigms. We will also discuss core programming languages concepts such as syntax and semantics, typing, compiling versus interpreting, and context-free grammars. Students will be expected to write programs in a variety of languages, complete a small number of other problem sets, and conduct a final project in which they research and present a language of their choice not covered in class.