Crafting Interpreters

Book relevance and scope

  • Widely regarded as still highly relevant despite being a few years old; foundations of interpreters/compilers don’t change quickly.
  • Positioned as an introductory, hands-on book rather than a reference on advanced or bleeding-edge techniques.
  • Some readers are slightly disappointed it doesn’t go into more advanced topics, but others argue that’s intentional and appropriate for its stated audience.

Learning experience and pedagogy

  • Many say it’s one of the clearest technical books they’ve read, with strong structure, pacing, and explanations.
  • Building two interpreters for the same language (tree‑walking in Java, bytecode VM in C) is seen as a major strength: you revisit concepts with deeper understanding.
  • Challenges at the end of chapters are recommended for solidifying understanding.
  • Several discuss how to “consume” it: generally advised to follow along coding, chapter by chapter, rather than just reading.
  • One annoyance: intermediate snippets sometimes don’t compile until later in the chapter; author explains this is a trade‑off to avoid distracting boilerplate and keep focus.

Implementation languages and translation

  • Some hesitate because of Java, but many say Java is readable if you know any C‑style language and can be treated as pseudocode.
  • Multiple readers reimplemented the interpreters in other languages (Python, Zig, C#, Clojure, Rust, PowerShell, etc.), finding that translation deepens understanding.
  • The C VM is seen as a good fit for low‑level languages like Zig and Rust.

Parsers, tools, and compiler techniques

  • Debate over lex/yacc vs hand‑written parsers:
    • Pro‑POSIX side: lex/yacc are standardized and “rock solid” once learned.
    • Critical side: poor UX, C‑only output, limited portability, and lots of magic macros; better to hand‑roll recursive descent, especially in a learning book.
  • The book explicitly avoids parser generators to eliminate “magic” and focus on understanding every line.

Static typing and advanced features

  • Several ask about resources for statically typed languages, generics, and type inference; suggestions include more advanced compiler texts and Algorithm W for Hindley‑Milner.
  • The author notes a follow‑up on types or native‑code compilation is tempting but hard: design space is large (subtyping vs not, erased vs reified generics, inference styles), and writing another book is a major commitment.

Garbage collection and runtime design

  • The GC chapter stands out for some; one reader describes a modification where GC is modeled as its own instruction to avoid in‑instruction collections and certain GC bugs.
  • Author responds that scheduling GC remains an under‑documented, practical problem despite many papers on algorithms.

Impact on readers

  • Many report the book demystified compilers/interpreters, gave them confidence to build their own languages or tools, and improved their understanding of recursion, trees, closures, and language semantics.
  • It’s frequently recommended as a first or second serious step into programming languages, often paired with more theoretical texts afterward.