Useful reading

The following is a non-systematic and idiosyncratic list, accumulated over time, of readings that I find useful for students of programming systems (and, in particular, for one student: me).

Textbooks, surveys, tutorials

Broad interest

Types and Programming Languages, textbook by Benjamin C. Pierce
The best introduction to the formal semantics of programming languages that I've ever seen. Pierce's writing combines lucidity, accessibility, and real technical meat in a way that that few other authors can match. This book serves equally well as a teaching tool and a reference, and belongs on the desk (and, frequently, in the hands) of every serious student of programming languages.
Uniprocessor Garbage Collection Techniques, survey paper by Paul R. Wilson of the UT Austin OOPS group (Extended version; accepted to ACM Computing Surveys.)
90% of what the average programmer "knows" about dynamic memory management (which includes garbage collection) is wrong. If only everyone would read this survey...

Niche topics

Tree Automata Techniques and Applications, textbook in progress by many authors (see foregoing link).
I found this book useful when investigating some XML-language issues (typed XML processing languages, notably XDuce, often use tree automata as an underlying formalism).
Elements of Basic Category Theory; technical report by Alfio Martini
Helpful for those who can't be bothered to buy a textbook on category theory until they know more about it. I keep hearing about category theory in many contexts (mostly related to monads), and I've been meaning to read this tech report Real Soon Now for at least a year. Anyway, it appears to give an accessible ground-up introduction to the subject.

Favorite research papers

Self: The Power of Simplicity, David Ungar and Randall B. Smith.
Self is a language that repays study. I find that every time I read this paper, I gain some new idea about programming languages. I've probably read it about a dozen times now.
FeatherWeight Java: A Core Calculus for Java and GJ, Atsushi Igarashi, Benjamin C. Pierce, and Philip Wadler. (Technical report version; also appeared in OOPSLA '99 and TOPLAS.)
A formal description of Java's "important" features that is pleasingly simple and rigorous, yet looks nothing like the lambda calculus. An inspiration to language designers everywhere who don't want to base their language on the lambda calculus, for whatever reason.
Non-Dependent Types for Standard ML Modules, Claudio Russo (PPDP'99)
Dave MacQueen's original paper on the Standard ML module system claims that SML module types are dependent --- i.e., the types depend on terms. Attempts to extend this system to higher-order modules have been notoriously hairy (interested readers should begin with the classic Harper/Lillibridge paper and citations thereof). Russo's contribution is a formal account of SML modules that cleanly eliminates dependent types entirely. I find this result both surprising (it upsets fifteen years of conventional wisdom) and natural (the "dependence" of module types has always seemed a little suspicious to me). If you sweat your way through Russo's formalism --- which is actually easier than it initially appears --- you'll understand ML modules far better than you did before. I haven't gotten around to the recursive and higher-order extensions though.
ML Modules and Haskell Type Classes: A Constructive Comparison, Stefan Wehr and Manuel M. T. Chakravarty (in submission, 2006)
Fills a major longstanding hole in the module systems literature, and bridges the gap between two of the four major currents in contemporary module systems research: parameterized modules and type classes (the other two are virtual types and aspects). Also a decent introduction to either modules or type classes if you know one but not the other.

Miscellany

The Early History of Smalltalk, Alan Kay (alternate HTML version)
Required reading for every langage designer.
The Expression Problem, Philip Wadler
A classic post to the java-genericity mailing list.
Who Says C is Simple?, George Necula
Section from the manual for CIL, an infrastructure for analyzing and processing C programs. The next time some hackers tell you that C's a clean and simple programming language (unlike those weird, complicated languages like ML and Haskell), send them to this document.
Notes on SML97's Value Restriction, Geoffrey S. Smith
What it sounds like. The Commentary on Standard ML has not been updated for SML'97; The Definition of Standard ML, Revised is rather terse; and the SML/NJ notes on SML'97 Types and Type Checking may not be enough for some readers.