For people who will practice the profession of software, programming-language skills are growing steadily more important. Twenty years ago most software practitioners got everything they needed from studying C or C++, maybe supplemented with a little Awk or Perl. Today's practitioners will use a much wider variety of programming languages, not just over the course of their careers, but even in their first jobs. Budding practitioners need a book that gives them something to do, so that they can develop skills. For a number of years I have been working on a book that aims to meet this need.
The book encourages hands-on experience with great ideas in programming languages. Because during their careers, some practitioners will need to assimilate new programming-language ideas from the academic literature, the book also gives readers an opportunity to learn the rudiments of programming-language theory.
The book develops three great ideas: functions, types, and objects. It also provides one chapter each on two other great ideas: garbage collection and logic programming. Functions, types, and objects are all central to the theory and practice of programming languages today, and they will continue to be central for many years. Garbage collection and logic programming are peripheral, optional topics.
The ideas are important, but what's more important is that people using the book will put the ideas into practice. To support that practice, I have embedded every idea into one or more "little languages," whose implementations I have integrated into the text. These languages resemble one another as much as possible: they differ only where they must. By eliminating gratuitous differences, I enable even beginning practitioners to analyze the remaining differences and to compare alternatives. And the built-in resemblances make the full collection of languages easier to learn.
To illustrate the rudiments of theory, I have specified the little languages formally, and I have connected the formal specifications with the evaluators and type checkers in the languages' implementations. Formal specification militates toward keeping things small, but the languages aren't too small: although formal specification is important, it's even more important to have languages that are big enough to write interesting programs in.
Finally, the book is loaded with exercises. Readers who actually do some exercises will develop substantial new programming skills and will also pick up a little theory. If you want to tackle programming languages in a way that marries code and mathematics, I hope you will be thrilled with this book.
I am publishing the book with Cambridge University Press. I'm currently revising chapters after peer review. I don't expect to finish the revisions before December 2018. If you are interested in reviewing a revised draft or a chapter, or if you want solutions to some of the exercises, please write to me.