Computer Science

Computer Science is a curious sort of science, one that implicitly ignores, and even explicitly opposes, the principles of the rest of science.

There are many models of computation: imperative versus declarative versus functional languages, SISD versus SIMD versus MIMD architectures, scalar versus vector versus multicore processors, RISC versus CISC versus VLIW instruction sets. But there is only one underlying physical reality: a patch of space can contain states, which can interact, and take time to transit. Anything else is a fiction.

Heroic efforts are now going into maintaining that fiction. Programming today is a bit like inhabiting the pleasure gardens in Metropolis, confident that the workers in the machine rooms down below will follow your instructions. Interconnect bottlenecks, cache misses, thread concurrency, data center power budgets, and the inefficiency of parallel processors (and programmers) are rumblings of discontent from below.

Software doesn't have physical units like time and space, but the hardware that executes it does. The code for an application program, the executable code that it's compiled to, and the circuits that run it don't look at all like each other. When a map is zoomed there's also a hierarchical structure from city to state to country, but the geometry of the representation is not changed. Why do we do that for software?

I blame two people for this state of affairs: Alan Turing and John von Neumann. They're famous for what were essentially historically important hacks. Turing was interested in the question of what was computable. His namesake machine was meant to be a theoretical model, not an experimental prescription. It had a head that read and wrote symbols stored on a tape. While that might sound straightforward, it's an unphysical distinction: persistence and interaction are both properties of a physical state. This segregation of function was elaborated in the organs of von Neumann's architecture. Even though that underpins most every computer made today, it was not intended to be a universal truth. Rather, it was articulated in an influential report that von Neumann wrote on programming within the very limited confines of an early computer, the EDVAC.

Turing and von Neumann understood the limits of their models; late in life they both studied computing in spatial structures, pattern formation for Turing and self-replication for von Neumann. But their legacy lives on in the instruction pointer in most any processor, the modern descendant of Turing's head reading a tape. All of the other instructions not pointed to consume information processing resources, but don't process information.

In nature, everything happens everywhere all the time. While an industry has developed devices for computation, a much smaller community has studied the physics of computation. Outside of what is traditionally considered to be computer science, they've developed quantum computers that use entanglement and superposition, microfluidic logic that transports material as well as information, analog logic that solves digital problems with continuous device degrees of freedom, and digital fabrication to code construction of programmable materials. Most importantly, programming models are emerging that represent and respect physical resources, rather than viewing them as a can to be kicked to someone else to worry about. It's turning out that this is easier rather than harder to do, because it avoids all of the issues of converting from an unphysical to a physical world.

In the movie The Matrix, Neo is given a choice between a red pill to exit the fictional world he's been inhabiting, or a blue pill to maintain the illusion. What he found when he got out was much messier, but ultimately much more satisfying. There's a similar choice now before the digital world, between avoiding or embracing the physical reality that it inhabits.

Think of Turing's machine and von Neumann's architecture as technological training wheels. They've given us a good ride, but something of a do-over is now needed to introduce physical units into software in order to be able to program the ultimate universal computer, the universe.