This course has no required textbook. See the Notes instead.
How to Design Programs, Second Edition (On-line Draft) by Felleisen, Findler, Flatt, Krishnamurthi.
If you have never seen functional programming, particularly type-driven design in functional programming, you should read this book.
This text uses the Racket environment and Racket-like programming languages so it can also serve as a good introduction to the programming language we will be using throughout this course, even if you are familiar with the concepts the book covers.
Computer Systems: A Programmer’s Perspective, Third Edition by Bryant and O’Hallaron.
This book gives an excellent overview of computer systems from a programmer’s perspective. Chapter 3 "Machine-Level Representations of Programs" is particularly relevant, giving a (for our purposes) comprehensive description of the x86-64 architecture we target in this course.
x64 Cheat Sheet Introduction to Computer Systems, Brown University, Tom Doeppner.
These lecture notes provide a quick overview of the x64 assembly language. Sections 1-3 will be the most relevant to our class. Section 4 has more to do with C-style data structures and the C calling convention. It is important to note that whenever this document refers to a function or function call, it is referring to a C-style function or function call.
An Incremental Approach to Compiler Construction, Scheme Workshop 2006, Abdulaziz Ghuloum.
This paper is the inspiration behind the design of this course. It describes the "incremental" approach we adopt where we study compilers by starting with a complete compiler for a very small language and incrementally grow it into a compiler for a powerful high-level language. If you would like to read a capsule summary of the course concepts, this is the paper for you.
Derived from the May 2019 version of the (4,922 page!) Intel® 64 and IA-32 Architectures Software Developer’s Manual. We will only use a small fraction of these instructions, but this is a comprehensive list of what’s available on a x86-64 machine.
Intended for those new to Racket, i.e. you!
The definitive, comprehensive manual for Racket.
"This series of five manuals describes everything you need to know about optimizing code for x86 and x86-64 family microprocessors."