
Course overview
How to Design Programming Languages
47 modules
·190 lessons
·—
Part 1
Part 2
Part 3
Part 4
Part 5
Part 6
Part 7
Part 8
Part 9
Part 10
Part 11
Part 12
Tree-Walk Interpreters
Part 13
Extending the Tiny Language with Statements
Part 14
Variables, State, and the Store
Part 15
Control Flow Constructs
Part 16
Functions, Closures, and Scope
Part 17
Typing Discipline and Design Choices
Part 18
Type Systems and Type Checking
Part 19
Type Inference and Polymorphism
Part 20
Operational and Denotational Semantics
Part 21
Static Analysis Beyond Types
Part 22
From AST to IR: Lowering and Desugaring
Part 23
Designing a Bytecode and VM
Part 24
Code Generation to Bytecode
Part 25
Interpreting and Optimizing Bytecode
Part 26
Exceptions, Error Handling, and Debugging Support
Part 27
Lowering to Low-Level IR
Part 28
Code Generation to Native Architectures
Part 29
Optimization Passes
Part 30
Garbage Collection and Memory Management
Part 31
JIT Compilation and Hybrid Execution
Part 32
Code as Data in Practice
Part 33
Macros: From Textual to Syntactic
Part 34
Designing Homoiconic Languages
Part 35
Staging, Partial Evaluation, and Generative Programming
Part 36
Metaprogramming Tooling and Debugging
Part 37
Modules, Packages, and Namespaces
Part 38
Build Systems, Toolchains, and REPLs
Part 39
Interoperability and FFI
Part 40
Multi-Target and Multi-Backend Languages
Part 41
Designing for Developer Experience
Part 42
Evolving a Language Over Time
Part 43
Language Design Patterns
Part 44
Semantic and Type System Patterns
Part 45
Runtime and Execution Patterns
Part 46
Implementing DSLs and Embedded Languages
Part 47