Thank you for considering Programming Language Pragmatics. The book is the outgrowth of more than a dozen years of teaching language and compiler courses at the University of Rochester, and reflects my conviction that language design and language implementation are best understood together. The text has been carefully designed to be appropriate for the traditional upper-level undergraduate course in programming languages, but with the hope of encouraging a more integrated treatment of design and implementation material. Conversations with colleagues across the country and around the world suggest that this integrated approach is increasingly appealing.
There are at least two important reasons for integration. First, it is at the boundaries between traditional areas of computer science -- and between language design and language implementation in particular -- where many of the most interesting tradeoffs arise. Numerous examples can be found in Appendix B. Second, as Computer Science has matured, it has become increasingly difficult for the typical undergraduate to sample a full range of "systems" courses. The popularity of the traditional compiler course has steadily declined as students work to fit such topics as networking, databases, graphics, and software engineering into their already over-crowded schedules. By incorporating implementation issues into the programming languages course, we can help to ensure that every student has at least some idea of what is going on "under the hood" in his or her favorite language.
Students with a particular interest in language design should be encouraged to take additional, follow-on courses in such areas as formal semantics, type theory, or object-oriented design. Similarly, students with a strong interest in language implementation should take a subsequent course in compiler construction. With this book as background, the compiler course will be able to devote much more time than is usually possible to code generation and optimization, where most of the interesting work these days is taking place.
At its core, Programming Language Pragmatics is a book about how programming languages work. Throughout the text I have endeavored not just to enumerate the differences among programming languages, but to explain why those differences exist. Most often the explanation has to do with tradeoffs -- between elegance and efficiency, space and time, generality and special needs. The emphasis throughout is thus on concepts rather than syntactic details. Examples are drawn from more than 40 different programming languages (see Appendix A), but no particular language is assumed as a prerequisite, and the examples should all be self-explanatory. Further, while there are chapters (10 and 11 in particular) devoted to details of object-oriented, functional, and logic programming, key concepts from these domains (polymorphism, data abstraction, information hiding, object lifetime and extent, tail recursion, side effect freedom, first-class and higher-order functions, applicative and normal-order evaluation, etc.) are thoroughly integrated into the rest of the text.