Terms and Conditions:
Shriram Krishnamurthi wrote:This book is available free-of-cost on the Internet. The edition you have was generated on January 15, 2006. For the latest version, please find me through a search engine. You should be able to access the book from my Web pages (which also provide a revision history); failing that, please contact me.
The book is the textbook for the programming languages course
at Brown University, which is taken primarily by third and fourth year undergraduates and beginning graduate (both MS and PhD) students. The book has been used at some other universities as a primary or secondary text.
This book is the fruit of a vision for teaching programming languages by integrating the "two cultures" that have evolved in its pedagogy. One culture is based on interpreters, while the other emphasizes a survey of languages. Each approach has significant advantages but also huge drawbacks. The interpreter method writes programs to learn concepts, and has its heart the fundamental belief that by teaching the computer to execute a concept we more thoroughly learn it ourselves.
While this reasoning is internally consistent, it fails to recognize that understanding definitions does not imply we understand consequences of those definitions. For instance, the difference between strict
and lazy evaluation
, or between static and dynamic scope, is only a few lines of interpreter code, but the consequences of these choices is enormous. The survey of languages school is better suited to understand these consequences.
Many more humans work by induction than by deduction, so a pedagogy that supports it is much more likely to succeed than one that suppresses it. The book currently reflects this design, though the survey parts are done better in lecture than in the book.
The book's goal is to not only teach students new material, but to also change the way they solve problems. This book shows students where languages come from, why they should regard languages as the ultimate form of abstraction, how to recognize such an evolving abstraction, and how to turn what they recognize into a language. The last section of the book, on domain-specific languages, is a growing step in this direction.
This book assumes that students are comfortable reasoning informally about loop invariants
, have modest mathematical maturity, and are familiar with the existence of the Halting Problem