This book explains the concepts underlying programming languages, and demonstrates how these concepts are synthesized in the major paradigms: imperative, OO, concurrent, functional, logic and with recent scripting languages. It gives greatest prominence to the OO paradigm. It includes numerous examples using C, Java and C++ as exemplar languages. It features additional case study languages: Python, Haskell, Prolog and Ada. It provides extensive end of chapter exercises with sample solutions on the companion Web site. It deepens study by examining the motivation of programming languages not just their features.