This book presents a detailed exploration of programming-language concepts and constructs across various paradigms (imperative, functional, logic, object-oriented).
It is intended for students who already have some programming experience and who wish to understand the why behind language design decisions, as well as the how of key constructs. There is an emphasis on comparing design choices (e.g., parameter passing, type systems, exception handling) across languages.
Because it was published in 1996 for the 3rd edition, it includes then-modern topics and language examples of that era.