This book introduces the concepts of diverse programming languages for students who have already mastered basic programming in at least one language. It is suitable for use in an undergraduate course for computer science and computer engineering majors. It treats all the knowledge units in the area of programming languages that appear in the ACM's Computer Science Curriculum 2008, and introduces the core units thoroughly. It gives programming exercises in three different language paradigms. Philosophically, it is in complete agreement with the ACM report. This book has two distinct kinds of chapters: practical and theoretical. The practical chapters are self-contained primers in three very different programming languages - ML, Java, and Prolog - at least two of which will be new languages for almost all students at this level. Students receive a quick introduction to the linguistically unique parts of each language and enough simple programming exercises to develop a feel for the programming paradigm of the language. There are excellent free implementations of all these languages available on a variety of platforms, including Windows, Unix, and Macintosh; the book's Web site at http://www.webber-labs.com/mpl.html has instructions on how to get them. The theoretical chapters present the underlying principles of programming languages. They are interleaved with the practical chapters in an order that allows ideas to be illustrated using examples in the newly learned languages and allows theoretical topics to be covered when their relevance to programming practice will be most evident. For example, Chapter 23 deals with formal semantics by starting with simple interpreters written in Prolog. These interpreters lead naturally to language definitions using big-step operational semantics. That is why formal semantics occurs so late in the book: only at the end of the Prolog tutorial are students ready to be led from Prolog exercises to this related, abstract topic.