Papers in Order

Programming Languages

From Turing's computable numbers to verified compilers and dependent types — the type theories, semantics, and verification techniques that decide what counts as a correct program.

20 papers 7 levels Included papers 1936 – 2023 MVRP 7 papers
0 of 20 papers read. Progress stays in this browser.

Minimum viable reading path

The 7 papers that give you most of the field's mental model, in reading order.

  1. On Computable Numbers, with an Application to the Entscheidungsproblem
  2. An Axiomatic Basis for Computer Programming (Hoare Logic)
  3. A Theory of Type Polymorphism in Programming
  4. Monads for Functional Programming
  5. RustBelt: Securing the Foundations of the Rust Programming Language
  6. LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation
  7. CompCert: A Formally Verified Optimizing Compiler
Level 0 Foundations of computation
01 On Computable Numbers, with an Application to the Entscheidungsproblem MVRP
TL;DR

Defines a universal computing machine and proves the undecidability of the halting problem.

Why read this

The founding document of computer science. Read it once carefully; everything else is footnotes.

Prerequisites

Basic logic, mathematical maturity

Key takeaway

Computation has a universal model — and inherent limits no clever programming can escape.

Read the paper
02 An Unsolvable Problem of Elementary Number Theory (Lambda Calculus)
TL;DR

Introduces the λ-calculus — function abstraction, application, and reduction — as a model of computation.

Why read this

The conceptual ancestor of every functional language; required to read modern type-theory papers.

Prerequisites

Basic logic

Key takeaway

Functions and substitution are enough to express any computation.

Read the paper
Level 1 Languages & semantics
03 Recursive Functions of Symbolic Expressions and Their Computation by Machine (LISP)
TL;DR

Introduces LISP, with eval, apply, and the s-expression as both code and data.

Why read this

A foundational language paper; the conceptual seed of every later language with first-class functions.

Prerequisites

Lambda calculus, basic recursion

Key takeaway

A small set of primitives is enough to bootstrap an entire language.

Read the paper
04 An Axiomatic Basis for Computer Programming (Hoare Logic) MVRP
TL;DR

Introduces a formal logic for reasoning about program correctness with pre- and postconditions.

Why read this

The foundation of program verification; you can't read modern verification papers without this.

Prerequisites

First-order logic

Key takeaway

You can specify what a program does separately from how it does it, and prove they match.

Read the paper
05 Communicating Sequential Processes
TL;DR

Models concurrency as communication between independent processes via synchronous channels.

Why read this

The intellectual ancestor of Go's channels and Erlang's actor model.

Prerequisites

Basic concurrency, first-order logic

Key takeaway

Concurrency is communication, not shared memory.

Read the paper
Level 2 Type theory
06 Towards a Theory of Type Structure
TL;DR

Introduces System F (parametric polymorphism) and the underlying theory of polymorphic types.

Why read this

The theoretical foundation under generics in every modern typed language.

Prerequisites

Lambda calculus, basic type systems

Key takeaway

Polymorphism can be a precise type-theoretic concept, not just a programming convenience.

Read the paper
07 A Theory of Type Polymorphism in Programming MVRP
TL;DR

Proves type-correctness for polymorphic functional programs and introduces type inference.

Why read this

The paper that gave us ML and the entire Hindley–Milner family of inferred type systems.

Prerequisites

System F, unification

Key takeaway

Polymorphism plus type inference is decidable and practical.

Read the paper
08 Principal Type-Schemes for Functional Programs (Damas–Milner)
TL;DR

Algorithm W — the type inference algorithm under every ML, Haskell, and Scala compiler.

Why read this

The algorithmic backbone of every Hindley–Milner type system in production today.

Prerequisites

Milner type polymorphism, unification

Key takeaway

Type inference is a constraint-solving problem with a clean algorithmic solution.

Read the paper
09 A Syntactic Approach to Type Soundness
TL;DR

A clean technique for proving type soundness via progress and preservation lemmas.

Why read this

The default proof structure for type soundness in modern PL papers; conceptually essential.

Prerequisites

Operational semantics, basic type theory

Key takeaway

Type soundness is two lemmas: well-typed programs don't get stuck and types are preserved.

Read the paper
Level 3 Abstraction & effects
10 Monads for Functional Programming MVRP
TL;DR

Shows how the category-theoretic notion of monad gives a clean handle on side effects in pure languages.

Why read this

The conceptual unlock for I/O, state, and exceptions in pure functional languages.

Prerequisites

Lambda calculus, basic Haskell helpful

Key takeaway

Side effects can be threaded through pure code as values of a parameterised type.

Read the paper
11 Definitional Interpreters for Higher-Order Programming Languages
TL;DR

Introduces continuation-passing style and definitional interpreters as semantic specifications.

Why read this

A foundational paper for understanding programming-language semantics and continuations.

Prerequisites

Lambda calculus, basic interpreters

Key takeaway

You can specify a language's meaning by writing an interpreter for it in another language.

Read the paper
Level 4 Memory & resources
12 Region-Based Memory Management
TL;DR

A static analysis that infers stack-like region annotations to manage memory without GC.

Why read this

A conceptual ancestor of Rust's lifetimes and a beautiful application of type inference to memory.

Prerequisites

Type theory, lambda calculus

Key takeaway

Compile-time region annotations can replace runtime garbage collection in a typed setting.

Read the paper
13 RustBelt: Securing the Foundations of the Rust Programming Language MVRP
TL;DR

A formal Iris-based proof of soundness for a substantial subset of Rust's type system.

Why read this

The right reference for understanding why Rust's ownership system is actually sound.

Prerequisites

Region-based memory management, separation logic

Key takeaway

Even unsafe code can be encapsulated soundly inside a strongly-typed language.

Read the paper
Level 5 Compilers
14 Efficiently Computing Static Single Assignment Form (SSA)
TL;DR

An efficient algorithm for converting programs to SSA form using dominance frontiers.

Why read this

The single most important compiler IR transformation; under every modern optimiser.

Prerequisites

Compilers, control-flow graphs

Key takeaway

A canonical IR where every variable is assigned once unlocks dataflow analysis at scale.

Read the paper
15 LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation MVRP
TL;DR

A compiler infrastructure designed for lifetime analysis and transformation, with a typed SSA IR.

Why read this

The infrastructure under Clang, Rust, Swift, Julia, and most modern compilers.

Prerequisites

SSA, basic compilers

Key takeaway

A clean, typed, modular IR is the right substrate for an entire family of language tools.

Read the paper
16 A Catalogue of Optimizing Transformations
TL;DR

The original catalogue of compiler optimisations: constant folding, CSE, dead code, code motion.

Why read this

Older than most readers, but the optimisation taxonomy is essentially unchanged.

Prerequisites

Basic compilers

Key takeaway

Most "modern" compiler optimisations were already named and described in 1972.

Read the paper
Level 6 Verification
17 Liquid Types
TL;DR

Refinement types with logical predicates inferred via abstract interpretation.

Why read this

A practical sweet spot between full dependent types and plain Hindley–Milner.

Prerequisites

Type inference, basic logic

Key takeaway

Predicate-rich types can be inferred automatically — and that changes who can use them.

Read the paper
18 CompCert: A Formally Verified Optimizing Compiler MVRP
TL;DR

A C compiler whose every optimisation is formally proved correct in Coq.

Why read this

A landmark in formal verification; proves you can verify a real-world piece of software.

Prerequisites

Coq, semantics, compilers

Key takeaway

A real, optimising compiler can be proven correct from end to end.

Read the paper
19 The Coq Proof Assistant: Reference Manual / Calculus of Inductive Constructions
TL;DR

The dependently-typed calculus and proof assistant that has formalised much of modern mathematics.

Why read this

The most influential proof assistant of the last 30 years; the verification toolkit of choice.

Prerequisites

Lambda calculus, type theory

Key takeaway

A dependently-typed language can serve simultaneously as a logic and a programming language.

Read the paper
20 The Lean Theorem Prover (System Description)
TL;DR

A modern dependently-typed proof assistant with a clean elaboration framework and serious automation.

Why read this

The proof assistant of the future-decade; behind the formalisation of large mathematical results.

Prerequisites

Coq, type theory

Key takeaway

A well-designed elaborator and tactic framework can make formal mathematics genuinely productive.

Read the paper