Compilers and operating systems have been a standard part of computer science education for more than thirty years, but the engines that allow the output of the first to run on the second have always fallen through the cracks. With all of today's hot languages now running on some sort of virtual machine, it was inevitable that textbooks on the subject would start to appear.
At first glance, these two identically-named books are polar opposites. The first, by Iain Craig, is slim and personal: it comes across as a tidied-up version of the author's personal notes on twenty-plus years of virtual machines. Its layout is dense ("tombstone TeX", as a friend in the publishing industry would say), and a large part of the book retraces the design of a toy VM created by the author.
The second, by Smith and Nair, is easily three times the volume. It attempts to be a comprehensive survey of VMs, covering everything from language execution engines to tools for virtualizing one operating system on top of another. There's a lot more whitespace, many more diagrams, and copious references to present-generation industrial-strength systems.
What these two books have in common is that neither particularly satisfied me. They're both solidly written, but not engaging; Craig contains reference material that could have been left online, while there are important topics that Smith and Nair should either have devoted an entire chapter to (with sample code!), or left out entirely. If I had to pick one for a course, I'd probably use Smith and Nair, but this field is still waiting for its "Dragon Book".
Iain D. Craig: Virtual Machines. Springer, 2006, 1852339691, 269 pages.
James E. Smith and Ravi Nair: Virtual Machines. Morgan Kaufmann, 2005, 1558609105, 638 pages.