Max Bernstein's Blog
CompilersPerformance / optimizationRuby / RailsLisp / Clojure / Scheme
- Posts
- 123 from 25 Jul 2012 to 21 Oct 2026
- Posting
- monthly (21 in the last year)
- Kind
- personal blog
- Feed
- https://bernsteinbear.com/feed.xml
2026 16
- Rails is a JIT compiler
- Objects, attributes, maps, oh my!
- Support Local Variables
- Another partial SSI trick with canonicalize
- A quick look at zero-knowledge proofs
- The inliner is yielding benefits for ZJIT
- Travel notes: PLDI Boulder
- A survey of inlining heuristics
- Checking assembly with Z3
- Travel notes: RubyKaigi Hakodate
- Partial static single information form
- Value numbering
- Using Perfetto in ZJIT
- A fuzzer for the Toy Optimizer
- Type-based alias analysis in the Toy Optimizer
- A multi-entry CFG design conundrum
2025 30
- The GDB JIT interface
- ZJIT is now available in Ruby 4.0
- Load and store forwarding in the Toy Optimizer
- How to annotate JITed code for perf/samply
- A catalog of side effects
- Walking around the compiler
- Linear scan with lifetime holes
- Linear scan register allocation on SSA
- Liveness analysis with Datalog
- Compiling a Lisp: Closure conversion
- How to use snprintf
- ClassDistribution from S6 JIT is really neat
- Heating water from afar
- Travel notes: PLDI Seoul
- What I talk about when I talk about IRs
- Zero-overhead checks with fake stack overflows
- A simple search engine from scratch*
- ZJIT has been merged into Ruby
- Writing that changed how I think about PL
- Precedence climbing
- Nix derivations by hand, without guessing
- Parsing to IR and lvalues
- Prospero challenge, now with more garbage collection
- Optimizing Django by not being silly
- Visualizing big data
- Representing type lattices compactly
- Interprocedural sparse conditional type propagation
- A catalog of ways to generate SSA
- A compiler IR for Scrapscript
- Weak references and garbage collectors
2024 19
- Into CPS, never to return
- A multi-emulator Gameboy tracer
- You can use C-Reduce for any language
- On the universal relation
- Adding row polymorphism to Damas-Hindley-Milner
- Damas-Hindley-Milner inference two ways
- What's in an e-graph?
- microui+fenster=small gui
- Precedence-aware pretty printing
- Abstract interpretation in the Toy Optimizer
- Some tricks from the Scrapscript compiler
- TCC does support __attribute__(section(...)), actually
- A baseline scrapscript compiler
- Compilers for free with weval
- Waking my computer from afar
- Neat parallel output in Python
- Vectorizing ML models for fun
- scrapscript.py
- Type information for faster Python C extensions
2023 5
2022 5
2021 3
2020 12
- Compiling a Lisp: Labelled procedure calls
- Compiling a Lisp: Instruction encoding interlude
- Compiling a Lisp: Heap allocation
- Compiling a Lisp: If
- Compiling a Lisp: Let
- Compiling a Lisp: Reader
- Compiling a Lisp: Primitive binary functions
- Compiling a Lisp: Primitive unary functions
- Compiling a Lisp: Booleans, characters, nil
- Compiling a Lisp: Integers
- Compiling a Lisp: The smallest program
- Compiling a Lisp: Overture
2019 3
2018 4
2017 13
- How to shoot yourself in the foot without really trying
- Writing a Lisp, Part 18: No Define
- Writing a Lisp, Part 17: Modules
- Writing a Lisp, Part 16: Standard Library
- Writing a Lisp, Part 15: I/O
- Writing a Lisp, Part 14: Comments
- Writing a Lisp, Part 13: Let
- Writing a Lisp, Part 12: Metacircular Evaluator
- Writing a Lisp, Part 11: Primitives 3
- Writing a Lisp, Part 10: Closures
- Writing a Lisp, Part 9: Quote
- Writing a Lisp, Part 8: ASTs
- Writing a Lisp, Part 7: Primitives 2