For many years, I studied computers without ever understanding how they work. On the inside, a computer is a monstrously complex beast, with layers upon layers of abstraction which ultimately boil down to electrons running through silicon, obeying the fundamental laws of physics. We’ve built up so many layers of abstraction that the vast majority of people using computers – even the vast majority of highly technical programmers – don’t know (and don’t need to know!) how it all works on the inside. But while understanding every single layer of abstraction to its fullest extent is practically impossible, it’s incredibly fascinating how modern computers are built and what physical principles allow them to function.

In this series of blog posts, I’d like to introduce you to many of the layers of abstraction bridging the gap between the laws of physics and assembly language. Given the rather large scope, I’m going to end up leaving out a lot of information about every topic I discuss. Just note that every topic I mention has, essentially, a field and a half solely devoted to it. With that said, let’s begin with circuits.