This book is very large and covers lots of features of programming languages, giving real examples. However, after using it for a long time (I used a few different editions) I still feel that it's not really useful.
Sebesta does not get into the theoretical part of programming language design, so the book does not help you with designing new languages. His comments on language features are also not very interesting.
He does not teach you how to write an interpreter or compiler, so the book is not a language implementation one.
And finally, the book can't be used to properly compare languages: not from a theoretical point of view, because he only briefly mentions syntax and dynamic semantics, without actually getting into real stuff (lambda calculus, types, denotational/operational semantics etc); and also not from a practical point of view because to compare languages in practice *you need to write programs in them*, and not just read a catalog of features and code snippets. Really, I don't think anyone would understand Scheme continuations, Common Lisp macros, Smalltalk programming environments, or Haskell Monads *and Monad transformers* without using them for real (or at least read real-world examples of how language features are used). I mean really understanding, and knowing *why* they were designed the way they were.
So, the book is useless. Seems like an attempt to compare languages, but done the wrong way.
By the way, the examples are not well chosen.
Instead of buying this book, I would:
- Buy one or more books on language implementation, if I wanted to implement a language, and actually write at least one compiler and one interpreter. Queinnec's Lisp in Small Pieces, Appel's Compiling with Continuations and Compiler books like those by Copper/Torczon, Appel or Louden.
For garbage collection there is a nice book by Lins and Jones (although a bit dated). Simon Peyton Jones also has a fine book on functional language implementation that could also be very useful.
- If I wanted to compare languages, I'd learn three or four different paradigms. *In practice*. Very different languages. For example, Prolog, Ruby, Haskell and Erlang. Maybe Scheme or Common Lisp also. And you only "understand" a language if you develop real, non-trivial projects in it, so I would actually create tools in those languages. Of course, a good programmer needs to know a minimum of how the interpreted or compiled code will work, so it's good to know about garbage collection, stack, heap, how threads are implemented in my interpreter, etc. (And Robert Sebesta's book will only give me *some* help here).
- If I wanted to create a language (or to compare languages from a theoretical point of view), I would do both things mentioned before, since I wouldn't feel comfortable creating a language without ever having used different paradigms, and then I would need to implement my language. I would have to read articles and books on language design, type theory, computability/lambda-calculus/term rewriting, formal semantics etc. The book by Turbak/Gifford on language design, Peirce's book on Types, seem like a *very* good start, for example. They are all more focused and in my opinion more useful than the grab-bag-of-language-features that I see in Sebesta's book.