Key features new! earlier exposure to programming languages and paradigms, allowing students to become aware of their power and their limitations. New! students will have an opportunity to write programs in one or more new languages much earlier in the course, thus giving them an opportunity to become proficient in alternative styles of programming. New! the material on the history of programming languages in chapter 2 has been condensed and moved to chapter 1, thus shortening the book by one chapter. A brief discussion of machine language and assembly language has also been added to this chapter. New! a case study on the design of python, a popular general-purpose scripting language, now follows the case study on c++ in chapter 2. The two case studies illustrate the tradeoffs that occur when designing new languages. New! the chapter on object-oriented programming is now the last of the three chapters on programming paradigms instead of the first one. The order of these chapters now reflects the increasing complexity of the underlying models of computation of each programming paradigm (functions, logic, objects). New! object-oriented programming in chapter 5 is now introduced with smalltalk rather than java. This new order of presentation will allow students to learn how a language was cleanly built around object-oriented concepts, before they see the tradeoffs and compromises that designers had to make in designing java and c++. New! the section on logical constraint languages in the chapter on logic programming has been replaced with a discussion of the functional logic language curry. New! beginning in chapter 6, on syntax, and extending through the chapters 7-10, on semantics, new end-of-chapter sections present a case study of a parser for a small language that resembles ada.