This is the best book I have come across in decades on a general "theory" of programming languages. Recent advances in machine learning are making us shift the emphasis on formal, a priori theories towards a more balanced approach with computer science becoming both analytical and empirical science. But in programming languages and compiler construction the overwhelming consensus was on the formal modelling ideas beginning with the BNF notation. Ravi Sethi, the author of the present book, himself is a co-author of the so-called "dragonbook" on compiler construction. But in this present book he rightly balances the formal modelling part with the discussions of the human aspects, like motivation and the needs of software developers and maintainers different from the needs of computational expediency, connected with programming and programming languages. The book has some rare gems on the history of the development of the ideas. And though he doesn't come across as quite an iconoclast, the book does dispel some of the naivete around programming paradigms and oaths of purity and sanctity.
It is not written as a textbook in the usual sense: setting question papers that can be corrected by teaching assistants is not easy if this is used as a textbook. However, the general subject of programming languages (not programming, not one programming languages, but principles of programming languages) should not be taught in a school-like fashion anyway.
With mobile, ubiquitous, pervasive, cloud and online machine learning computation as new extensions, I wish the author expands this splendid book into a new edition.