CSC 131
Principles of Programming Languages

A programming language is a programmer's principal interface with the computer. As such, the choice of an appropriate language can make a large difference in a programmer's productivity. A major goal of this course is to present a comprehensive introduction to the principal features and overall design of both traditional and modern programming languages. As such you will be examining language features both in isolation and in the context of a more complete language description.

This summer I participated in a workshop on the design of programming languages courses. This course will be based on many of the recommendations. As stated in the report, "Programming languages are fundamental to program design, analysis, and implementation ...". Every student graduating with a bachelor's degree in computer science should be able to:

  1. Quickly learn programming languages, and how to apply them to effectively solve programming problems.
  2. Rigorously specify, analyze, and reason about the behavior of a software system using a formally defined model of the system's behavior.
  3. Realize a precisely specified model by correctly implementing it as a program, set of program components, or a programming language.

A more detailed specification of the course proposal and justification of its contents can be found at

We will examine features of a large variety of languages, though we will not study many of languages themselves extensively. Like other CS courses, we will be discussing alternate ways of solving problems, looking at the pros and cons. Because programming languages are so tied up (and motivated by) programming problems, we will not only investigate language features, but also the software engineering problems which spawned them.

We will also investigate and practice writing interpreters and/or compilers for simple programming languages. This hands-on experience will provide a firm grounding in both the run-time characteristics of programming languages and the formal specification of programming language semantics. We will also see how the formal specification of different aspects of languages allows us to prove properties of the languages themselves, such as type safety, as well as reason properly about programs in the languages.

At the end of this course you should have a more thorough understanding of why certain programming language features provide more support for the production of reliable programs, while others are fraught with ambiguity or other problems. Since programming languages mediate between the programmer and the raw machine, we will also gain a deeper understanding of how programming languages are compiled, what actually happens when a program is executed on a computer, and how the programming language design affects these. As an example, by the end of the course, you should be able to understand why Java is generally considered a more reliable language than C or C++, while it will also generally execute a bit slower. Similarly you will understand why Python must execute significantly slower than Java or C++.

Toward the end of the course we will turn our atention to one of the biggest current problems in computer software: How to write concurrent and parallel programs. Our particular focus will be on languages that can support these programs. This is now a focus of considerable research, and we hope for a break-through in the near future, as we need to learn how to use the new multi-core (and soon many-core) computers effectively to create faster software.

This course will involve extensive reading on your part, both in the text and in outside sources. The segments of the course which introduce new programming language paradigms will also feature some relatively simple programming in languages representative of the functional and object-oriented paradigms, such as ML, Java, and others).

To simplify printing of the information about CSC 131 found on these pages, a single page on which all the information about CSC 131 is grouped together is also available.