Crafting Interpreters
Robert Nystrom
Builds a tree-walking interpreter and then a bytecode one for the same language, arguing that implementing a language teaches it faster than reading a spec.
link checked 17 Sept 2026Turning source text into something a machine will execute.
11 topics · 17 curated works
No prior grounding assumed.
Crafting Interpreters
Robert Nystrom · 2021
Builds a tree-walking interpreter and then a bytecode one for the same language, arguing that implementing a language teaches it faster than reading…
Assumes you know the vocabulary.
Linkers and Loaders
John R. Levine · 1999
Treats linking and loading as a coherent subject in its own right, arguing the topic is under-taught precisely because it sits between compilers and…
+4 more at this level
Primary sources and full treatments.
On the Translation of Languages from Left to Right
Donald E. Knuth · 1965
Defines LR(k) grammars and proves they can be parsed deterministically in linear time, giving parser theory the class that most real-world parsing…
+10 more at this level
12 of 17 works
Robert Nystrom
Builds a tree-walking interpreter and then a bytecode one for the same language, arguing that implementing a language teaches it faster than reading a spec.
link checked 17 Sept 2026John R. Levine
Treats linking and loading as a coherent subject in its own right, arguing the topic is under-taught precisely because it sits between compilers and operating systems.
link checked 17 Sept 2026Torben Ægidius Mogensen
A complete compiler course from lexing through code generation and register allocation, built around one running example, published free by the author for exactly that self-teaching use.
Sarkar, Waddell & Dybvig
Argues a compiler is easier to build, test and debug as many small, single-purpose passes over explicitly defined trees than as a handful of large, monolithic ones.
15 pageslink checked 17 Sept 2026Ian Lance Taylor
Walks through what a linker actually does — symbol resolution, relocation, the ELF format — a step at a time, arguing the subject is simpler than its reputation once laid out in order.
Computerphile
Separates tokenising from parsing and shows why a grammar, not a sequence of string checks, is what lets a compiler recognise nested structure at arbitrary depth.
link checked 17 Sept 2026Donald E. Knuth
Defines LR(k) grammars and proves they can be parsed deterministically in linear time, giving parser theory the class that most real-world parsing algorithms are built to handle.
Ken Thompson
Gives an algorithm for compiling a regular expression into a nondeterministic finite automaton, the construction that still underlies how lexers and text search tools scan input in one pass.
Gregory J. Chaitin
Recasts register allocation as graph colouring, so that a compiler decides which values conflict and lets a colouring algorithm decide which live in registers and which spill to memory.
L. Peter Deutsch & Allan M. Schiffman
Introduces inline caching, showing that a bytecode interpreter can approach compiled-language speed by having each call site remember and reuse the method it resolved last time.
Cytron et al.
Gives an efficient algorithm for converting a program into static single assignment form, the representation that made a generation of dataflow optimisations simpler and faster to implement.
Christopher W. Fraser, David R. Hanson & Todd A. Proebsting
Shows that a code generator built from simple tree-pattern matching and dynamic programming can rival hand-written ones, making retargetable code generation practical rather than a research curiosity.