Ideas can change the world.

Not every idea can do so literally, however.

Programs can.

Programs are ideas so clear in their intent that they are linked inextricably with meaning; ideas so clearly realizable that they can mechanistically express that meaning in — or on — the world. For millenia, the only word humans imagined for such ideas was magic.

Programs are magic, and programming languages are the medium of magic. A good language delivers that magic into the hands of programmers. It makes it possible for them to write expressive programs—clear, concise, elegant and efficient.

In this course we will study programming languages, and how they enable this kind of expressiveness. We will look at the basic concepts of languages, and how different kinds of language mechanisms can fit together in different ways. The material will be intellectually substantive and challenging. At the same time, it should be practically useful over your career. You will learn to see the similarities and differences among the thousands of languages we use every day. You will learn not to be fazed as new languages come and go. You will also learn how to design and/or choose a new language when that might make a program you want to develop much easier to write.

The course involves programming, thinking, and good fun discovering what languages, programs and computations really are.

Welcome to 311. I hope that you will find the course rewarding.

High-Level Course Learning Goals

A central concept of this course is that a programming language is built in large part from a collection of individual language design choices. We therefore can (and will) explore the space of languages by exploring the axes that define these choices.

Thus, each of the high-level learning goals below is in a sense “parameterized” by the language design choices under consideration. Similarly, you should find that the kinds of tasks we expect you to perform on assignments and (particularly) exams feel similar across the language design choices we study.

What language design choices or features will we study? Definitely:

And many more that we may discuss (e.g., continuations and call stacks, probabilistic programming, types, objects, or others)!

Given all that, our parameterizable high-level learning goals are for you to be able to: