This course is, at heart, a classics course, where we will be reading some of the great books, as it were, involved in the development of computer science.
If you take an automata theory course, you will hear echoes of the path from from finite state automata theory to Turing's seminal work in the 1930s and 1940s to the work to Noam Chompsky's work on formal grammars in the 1950s and 1960s. While most automata theory courses are not structured as history, the mathematics lends itself to a historic exposition.
In contrast, courses on programming and computer architectur are frequently taught as if the systems and languages we use today exist outside of history. You learn Java or the architecture of the Intel microprocessors found in today's desktop machines as if they were products of nature in a creationist universe, timeless and eternal creations that simply are, with no history or predecessors.
Where the history of computer systems is mentioned, it is usually done disparagingly, as if the past was irrelevant to the future since those old machines were so small and so slow that nothing that was done on them could possibly be relevant today.
Our goal in this course is to correct this, looking at programmable machines and programming systems from the early years of computing not as archiac relics but as extraordinary innovations that, in most cases, embodied potentials that were not understood by their developers, much less by the larger contemporary world at the time these systems were developed.
Because we are studying hardware, in significant part, the key prerequisite for this is that you understand the instruction set of some modern computer at the assembly language level. We will focus closely on the evolution of the idea of a programmable machine, up to the level where virtualizaiton becomes an issue, and then we will look at different ways of creating virtual machines on top of physical foundations.
It is worth noting that Babbage's great insight, that computation could be mechanized and that mechanical computing engines could be programmable, came almost exactly a century before Church and Turing laid the mathematical foundations for understanding programmable machines and what they can do. This pattern is not unique. The programming languages designed in the 1950s, FORTRAN and Algol, were at least a decade ahead of theoretical computer science's ability to formalize what it is that they do.
Computer science is driven not by theory, but by the pragmatic need to get some kind of computing job done. Again and again, we have constructed machines and virtual machines that do those useful computing jobs log before we reach a sound theory of what it is that those jobs involve. In this course, our emphasis is on the work of the innovators who have lept ahead of the theory, not on the theorists much needed follow-up work.