Most computer scientists will not work on the design of a major programming language during their careers. However, many will need to apply programming language design principles as they solve problems and forge new research directions. This course will help you understand the underlying foundations and concepts of programming languages, and learn how to apply them to specific problems.
We approach the study of programming language design by studying several classes of languages. We will look in detail at one or more language in each class. We will look at what makes the language and computing paradigm upon which it is based useful and examine the strengths and weaknesses of each. We will use the programming language, ML, as our main language for experimentation and exploration.
You should be competent in (preferably more than) one high-level programming language. You also should be comfortable with discrete mathematics and foundations of computer science. Ideally, you should know a functional programming language, like LISP or Scheme, a procedural language like C, C++, or Java, and an object-oriented language. You should also be able to learn new programming languages without undue difficulty. This course requires you to move easily between theory and practice, and you should be prepared to do so.
Three hours of lecture can be quite boring, for you and for me. I plan on breaking most class sessions into two or three parts.
In order to get the most out of the classes, you should make sure that you devote the time beforehand by reading the material, doing the assigned problems (at a minimum) and formulating questions for clarification or discussion.
The pages that are linked below provide all of the information you need for the class. These pages will change frequently and you should look at them at least once a week.