Early in my programming career, like most beginner programmers starting out, I learned higher level programming languages such as BASIC, Pascal, C++ (and later on C#). I soon found myself asking questions that always seemed to lead me to the lowest layer of the computer construct. It simply wasn’t enough to understand the language and the art of programming at the higher level, I desired more of an understanding of what the machine was doing at the lowest hardware layer (specifically the processor, machine code, the various buses, and memory).
Most universities today have computer science courses (which focus primarily on the programming and software aspects of computers) and computer engineering courses (which focus primarily on hardware and electrical design of computers). This may not be a major revelation, but as a computer scientist (or programmer), the further you move toward lower level languages (i.e. Assembly Language) the more you need to understand about how the hardware was designed to function.
I have read many books on Assembly Language and the major take away from all of them was this: “Through an understanding of the lowest practical human-interpretable computer language (assembly), the programmer gains a true appreciation for the machine he is instructing. This ultimately leads toward much more efficient and streamlined programming with higher level languages.” Makes sense right? So where does one begin this journey?
Not surprisingly, in the internet-driven world we live in, I have found many excellent sources online (both video and textual) that provide a foundation for the understanding of how these extremely complex nanometer-sized machines work. Even more interesting, I have found some great resources related to the history of these machines which also seemed necessary in order to have a full appreciation for the technology and to “close-the-loop” in my understanding. If you don’t like rabbit holes, I suggest you move on to the next article, because once you start down this path, it is a longing albeit extremely fascinating journey.
The Microprocessor and its applications by D. Aspinall. (partial primer)
History of Microprocessors
Grace Hopper (pioneer of computer compilers)
History of compiler construction
Intermediate Language Representation
Transistor-Transistor Logic (TTL)
Understanding NAND Logic
Dynamic Random Access Memory
Locality of reference (temporal and spatial) with focus on memory caching systems
The art of assembly language programming (best assembly language resource I have found thus far)
Outstanding Video Series on Computer Architecture
This is a good list to get started. As I come across more resources I will update the list.