Texts
This course has no required textbook. See the Notes instead.
1 Background
 - 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. 
2 References
- x86 and amd64 instruction reference - 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."