In the early days of computer science, the interactions of hardware, software, compilers, and operating system were simple enough to allow students to see an overall picture of how computers worked. With the increasing complexity of computer technology and the resulting specialization of knowledge, such clarity is often lost. Unlike other texts that cover only one aspect of the field, The Elements of Computing Systems gives students an integrated and rigorous picture of applied computer science, as its comes to play in the construction of a simple yet powerful computer system.
Indeed, the best way to understand how computers work is to build one from scratch, and this textbook leads students through twelve chapters and projects that gradually build a basic hardware platform and a modern software hierarchy from the ground up. In the process, the students gain hands-on knowledge of hardware architecture, operating systems, programming languages, compilers, data structures, algorithms, and software engineering. Using this constructive approach, the book exposes a significant body of computer science knowledge and demonstrates how theoretical and applied techniques taught in other courses fit into the overall picture.
Designed to support one- or two-semester courses, the book is based on an abstraction-implementation paradigm; each chapter presents a key hardware or software abstraction, a proposed implementation that makes it concrete, and an actual project. The emerging computer system can be built by following the chapters, although this is only one option, since the projects are self-contained and can be done or skipped in any order. All the computer science knowledge necessary for completing the projects is embedded in the book, the only pre-requisite being a programming experience.
The book’s web site provides all tools and materials necessary to build all the hardware and software systems described in the text, including two hundred test programs for the twelve projects. The projects and systems can be modified to meet various teaching needs, and all the supplied software is open-source.
- I’ve been programming for about three years now, and have picked up a few different languages in that time, including Python and Java. I didn’t study Computer Science in college however, so although I knew how to write code to perform certain tasks I didn’t truly understand how that code was ultimately being executed on my computer. My curiosity eventually led me to purchasing this book and I am extremely happy with that decision. Going all the way from simple logic gates to writing a compiler and standard library for your own programming language this book explains, in a very approachable way, how the code in the high level languages people write in is translated into machine code and run on hardware. I now feel I understand how all the pieces in this chain work, if only at a high level. I would highly recommend this book to anyone who may not have a thorough computer science background but is familiar and interested in programming languages.
- I’m hoping and praying these authors do a new edition, but in the meantime, they have been beyond ethical in keeping the web resources up to date, even at this writing. Way beyond that really, because the material on the web is SO much more than “supplemental” — it includes the entire text, .pdf lessons, and if you’re an autodidact or teacher, complete teaching materials! If you check out the wonderful Amazon “look inside” feature, you’ll see an out of date website, but it still forwards to the new site (the old one is the ldc dot ac, the new one is nand2tetris dot org). The nand2 is a symbol for the fact that you can start all the way from a nand gate and build your virtual machine to run your own programmed tetris game!
For Raspberry and Arduino (or Propeller) buffs like me, although this project is all virtual (no physical circuits), the authors have taken nearly 10 years to perfect the sim interfaces to make the experience far more complete than even building a PC from components, or hacking with our favorite chips and boards. This book is the PC version of the now famous Max Maxfield books that teach us to build a virtual calculator
Frankly it’s rare to see authors not only spend this much time on support, then keep it going years later! They also get five stars on textextras dot com for their commitment to keeping the text current. Highly recommended for both classes and self study. Although one 11 year old has built one with help, I’d put this at teen to postgrad. I know, quite a range, but it IS that good.
- I wanted to learn some programming languages and concepts to make my Technical Writer resume meatier. Problem was, any attempt to learn Python, SOAP, or MySQL just lead me to ask a million questions about how this stuff actually worked beneath the straightforward, high-level application stack: How does this code interact with the OS? How do lines of text get turned into binary instructions? How does all this abstract graphics, text, and data actually meet up with electrical signals and semiconductors? It has to at some point, right? It’s not magic, right? (And so on).
I grabbed this book because working from the bottom up, from NAND gates to a functional OS, sounded like the best process to learn. I’m on Chapter 6 right now (about half way through the book), and I know I’ve made the right choice. The best part of this course is that you actually build every single layer of the computer architecture using their free suite of visualization tools. This means that, every time you start a new chapter and take the next step up the ladder of the computer hierarchy to the place you actually live in (i.e. an operating system with a graphical user interface), you understand exactly why you’re building what you’re building–and how exactly it relates to all the layers beneath it.
I’m not a mathematics guy (I spent seven years in college studying literature; hence why I need this book!), but with some perseverance, several hours spent with a constantly furrowed brow, and a not insignificant amount of cursing, I’ve been able to puzzle through every single one of the tasks set out by the book so far. If you have some natural curiosity and critical thinking skills, you’ll be able to get through this book no matter how non-technical your background is. What’s especially helpful is that there are resources outside the book itself: The online forums for this book are (as of April 2014) very active, and you can either wait a day or two to have an expert look at your code and see all the various ways you’re screwing up, or you can search to see if your particular question has already been answered (it usually has).
It’s not all wine and roses, of course. The UI of the software suite is pretty rough, with a few apparent bugs (I’m using them in a Mac OS, so that might be the root of some of the problems). Also, the hardware description language (HDL) you use in the first half of the book often seems unnecessarily finicky (I hope you didn’t put “and” instead of “And” somewhere in your 100 lines of code…). And, though the book mostly follows a path straight up the latter of abstraction, Chapter 4 jumps up to the software (assembly code) level, then follows with Chapter 5, which drops back down into the hardware of the CPU and memory. This structure actually kind of makes sense once you get through both of these chapters (there may be no other way to do it, now that I think about it), but it’s pretty disorienting trying to get through the lower layers of software when the hardware is still sitting around in pieces, only half explained. Some context/additional explanation at the beginning of Chapter 4 would have helped with this.
Also note that, when you hit Chapter 6, you’ll need some prerequisite high-level coding/scripting experience. It doesn’t really matter what language you know; you just need to know one. If you’re completely new to coding, I would recommend learning some Python via Codecademy; it’ll probably be a month or two detour from the book (depending on how fast you work), but it’ll be worth it.
In summary, I can’t think of a more efficient way to get a thorough overview of Computer Science than this book. Any shorter of an explanation won’t really make sense; any more in-depth of an explanation would probably lose everybody but the people getting college degrees in this stuff. For new students to the field, or for amateurs with an interest, this book hits the sweet spot.