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 vs. interpreting, and context-free grammars. Students will be expected to write small programs in a variety of languages, complete a small number of non-programming problem sets, and conduct a final project in which they research and present a language of their choice not covered in class. Prerequisite: One previous programming course (in any language).