Main Page
From CS 152
Computer Science 152
Principles of Programming Languages
Harvard University - Spring 2009
David F. Bacon
Lectures: Tuesdays and Thursdays, 10:00am-11:30am, Location: 60 Oxford St, room 330
Intellectual tools needed to design, evaluate, choose, and make effective use of programming languages. Covers the major concepts that form the backbone of almost all languages: syntax, abstraction mechanisms, modularity, type systems, naming, polymorphism, closures, continuations. Case studies of advanced languages. In response to changing hardware architectures, parallel programming constructs and techniques will be a major focus. Formal semantics, standardization, and portability. Grounding sufficient to read professional literature.
Quick links: Syllabus and Lecture Notes | Assignments | Course Policies | Resources | Announcements | Textbook
Prerequisite: Computer Science 51; Computer Science 121 is recommended. Students must have good programming skills, be comfortable with recursion, basic mathematical ideas and notations. Feel free to contact the instructor if you have questions about the requirements or other aspects of the course.
Course Information
- Course Staff
- Syllabus and Lecture Notes
- Assignments
- Course Policies
- Additional Resources and Handouts
- Textbook information
- Programming Language Design Wall of Shame
- Remember: everything's better with Bacon, even this web page
Overview of the Course
I view programming languages as a fundamental discipline which all practicing computer scientists should know -- whether they be researchers, programmers, entrepreneurs, or executives. After all, almost every computation in the world (at a rough guess, 15,000,000,000,000,000,000 instructions every second) was written in some programming language. Languages are fundamental to how we think about and solve problems in computation.
In this course you will study the fundamental ideas, structures, and techniques in programming languages that have been devised over the last 50 years. You'll see language constructs that make it progressively easier to express computations, and shift the burden from humans to machines. We'll study how to describe languages both intuitively and formally: their appearance and their meaning. And you'll develop an understanding of and appreciation for the complex interplay between mathematics, engineering, and aesthetics that go into making a successful language.
Armed with these tools you will be better prepared for any career in which computation plays a significant role:
- as a programmer you will be able to learn new languages in a matter of days, since you will be able to identify all of the fundamental building blocks from which it is created.
- as a designer, manager, or entrepreneur you will be able to make informed decisions about what languages and structuring techniques should be used to build software artifacts, large or small. The right choice can make the difference between whether your project succeeds or fails, your company IPOs or dies, or your project costs $5 million or $50 million.
- you will recognize situations in which the right solution is to create a new "mini-language" which radically simplifies the problem.
- you will be able to read scientific literature in the field and be prepared for graduate study in computer science.
Concurrency: Recent trends in semiconductor manufacture and computer architecture have fundamentally altered the way in which computers are designed and built (see for instance this article). In the future, rather than getting faster and faster (the way they have for the last 40 years) computers will have more and more processors (you may have a "Core Duo" processor in your laptop -- with 2 processors). This makes computers radically harder to program. Therefore, unlike almost every other languages course, in which techniques for parallel programming are relegated to one or two lectures at the end, we will study techniques for programming multiple processors as an integrated part of this course. This will prepare you to work in this new environment, and, I hope, to create the innovations that will allow us to exploit the computers of the future.
Course Project: the second half of the course will revolve around a project in which you design and implement a language (or extend an existing one) that includes features for parallel programming. A significant portion of the homeworks during this period will include milestones to help you develop the project in a well-paced manner. Projects can be done in groups of 1-4 people.
Access to Advanced Systems: In order to study parallelism in a meaningful way I have obtained access to state-of-the-art computers for use in the homeworks and the projects. These include
- 4-processor Linux machines for day-to-day use.
- a 96-processor Azul Vega 2 multiprocessor custom-designed for running Java.
- up to 1024 processors of an IBM Blue Gene supercomputer (the largest one has 106,496 processors and is the third-fastest computer in the world).
- a Tilera machine with 64 processors on a single chip.
- I am also working on getting access to a supercomputing cluster of graphics processors and to a network of cell phones.
Guest Lectures: to give you a sense of how language designers think and work, and to inspire you in your language design projects, I have arranged for guest lectures from some of the foremost language designers and implementers in the world:
- Brian Kernighan, author of the "K&R" C book, co-creator of Unix, leading thinker on the practice of programming, designer of the AWK and AAMPL languages, and professor at Princeton.
- Guy Steele, co-creator of the Scheme and Fortress languages, co-author of the Java language specification and the Common Lisp and C language standards, and Fellow at Sun Microsystems.
- David Ungar, creator of the SELF programming language, pioneer in implementation techniques for object-oriented systems, and radical thinker on exploratory programming languages and environments.
WikiPoints: increase global knowledge and improve your grade at the same time! You will receive credit if you make any significant edits to or create new pages on WikiPedia in the area of Programming Languages that "stick".
Help using this Wiki site
- Consult the User's Guide for information on using the wiki software.
- Configuration settings list
- MediaWiki FAQ
- MediaWiki release mailing list
