<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/plush-s-new-register-based-interpreter-is-insanely-fast-nsqme5hay" -->

---
title: Plush&#x27;s New Register-Based Interpreter Is Insanely Fast
description: A deep technical dive into rewriting the Plush programming language&#x27;s interpreter from a stack-based design (like CPython) to a register-based design (like...
canonical: https://daily.dev/posts/plush-s-new-register-based-interpreter-is-insanely-fast-nsqme5hay
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Plush&#x27;s New Register-Based Interpreter Is Insanely Fast | daily.dev
og:description: A deep technical dive into rewriting the Plush programming language&#x27;s interpreter from a stack-based design (like CPython) to a register-based design (like...
og:url: https://daily.dev/posts/plush-s-new-register-based-interpreter-is-insanely-fast-nsqme5hay
og:image: https://api.daily.dev/og/posts/nSQme5HAY.png
og:image:alt: Plush&#x27;s New Register-Based Interpreter Is Insanely Fast
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Plush's New Register-Based Interpreter Is Insanely Fast

**[Pointers Gone Wild](https://daily.dev/sources/pointersgonewild)** · 16 min read · 14 upvotes · 1 comments

## Summary

A deep technical dive into rewriting the Plush programming language's interpreter from a stack-based design (like CPython) to a register-based design (like Lua), using a 64-bit instruction word. The rewrite, combined with a series of targeted optimizations (fused compare-and-branch, immediate shifts, constant deduplication, better branch layout, etc.), yields a geometric mean speedup of 1.94x over the old interpreter, with a median of 2.07x and a max of 3.37x across benchmarks. Benchmarked against CPython, CRuby, and Lua, Plush now outperforms Lua by 24-55% on select benchmarks and is fast enough to run Quake-level 3D rendering with texturing at interactive frame rates. Includes new install scripts for macOS/Linux/Windows and discusses future plans around object header sizing, TCP networking, and error handling.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://pointersgonewild.com/2026-09-02-plushs-new-register-based-interpreter>

## Questions this post answers

### Why are register-based bytecode interpreters faster than stack-based ones like CPython's?

Register-based interpreters need far fewer instructions because they operate directly on register slots instead of shuffling values between local variable slots and a temporary stack. Fewer instructions means less dispatch overhead, which is one of the biggest costs in an interpreter due to branch mispredictions. This is why Lua's register-based interpreter is known for being fast, while CPython and CRuby's stack-based designs are comparatively slow.

_Developers benchmarking interpreter designs can follow ongoing VM performance work like this on daily.dev._

### How much faster did the Plush programming language interpreter get after switching from a stack-based to a register-based design?

Switching to a register-based design alone gave a 1.55x geometric mean speedup, and additional optimizations like fused compare-and-branch instructions, immediate-value shifts, and constant deduplication added another 25% on top, for a total geometric mean speedup of 1.94x. Median speedup across benchmarks was 2.07x, with the maximum reaching 3.37x, measured on a MacBook Air M5 with rustc 1.96.0.

_Anyone tracking real-world interpreter optimization gains can follow benchmarks like these on daily.dev._

### How does the Plush language's performance compare to Lua, CPython, and CRuby on function-call-heavy benchmarks?

Plush outperforms Lua 5.5.1 by 24% on the fib benchmark and 55% on binary_tree, both benchmarks focused heavily on function calls. Lua is generally faster than CPython 3.14.6 and CRuby 4.0.6, but Plush's simpler, less dynamic semantics (immutable global functions and variables, tagged integers) let its bytecode compiler statically resolve call targets and fold constants, giving it an edge.

_Developers weighing language runtimes for performance-sensitive work can track comparisons like this on daily.dev._

## Community discussion

Top comments from developers on daily.dev.

**@agustinbarrientos** · 1 upvotes

> How does the 64-bit instruction format compare with a packed 32-bit form once programs grow beyond these microbenchmarks? The extra operand space helps codegen, but the instruction cache may expose a different tradeoff.

## Similar posts on daily.dev

- [Optimizing the Plush Interpreter for Faster Raytracing](https://daily.dev/posts/optimizing-the-plush-interpreter-for-faster-raytracing-jzadmkzg6) · Pointers Gone Wild · 1 upvotes · 0 comments
- [Replacing a Rust Enum with a 64-bit Word Made My Interpreter 17% Faster](https://daily.dev/posts/replacing-a-rust-enum-with-a-64-bit-word-made-my-interpreter-17-faster-vl1pbon5a) · Pointers Gone Wild · 7 upvotes · 1 comments
- [Speeding Up the Plush Garbage Collector](https://daily.dev/posts/speeding-up-the-plush-garbage-collector-94olnbjbh) · Pointers Gone Wild · 13 upvotes · 0 comments

---

Tags: [#performance](https://daily.dev/tags/performance), [#rust](https://daily.dev/tags/rust), [#virtual-machine](https://daily.dev/tags/virtual-machine)

[View this post on daily.dev](https://daily.dev/posts/plush-s-new-register-based-interpreter-is-insanely-fast-nsqme5hay)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Plush's New Register-Based Interpreter Is Insanely Fast","url":"https://daily.dev/posts/plush-s-new-register-based-interpreter-is-insanely-fast-nsqme5hay","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/plush-s-new-register-based-interpreter-is-insanely-fast-nsqme5hay"},"datePublished":"2026-09-02T13:08:18.494Z","dateModified":"2026-09-02T13:16:44.429Z","description":"A deep technical dive into rewriting the Plush programming language's interpreter from a stack-based design (like CPython) to a register-based design (like...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/6d60fa32a62bdbaea765cd9df703ae8d?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/6d60fa32a62bdbaea765cd9df703ae8d?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Pointers Gone Wild","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Pointers Gone Wild","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/ae0b966a89554ad5b6d54de550180ab0","url":"https://daily.dev/sources/pointersgonewild"},"commentCount":1,"discussionUrl":"https://daily.dev/posts/plush-s-new-register-based-interpreter-is-insanely-fast-nsqme5hay","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":14},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":1}],"keywords":"performance,rust,virtual-machine","timeRequired":"PT16M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Pointers Gone Wild","item":"https://daily.dev/sources/pointersgonewild"},{"@type":"ListItem","position":3,"name":"Plush's New Register-Based Interpreter Is Insanely Fast"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/plush-s-new-register-based-interpreter-is-insanely-fast-nsqme5hay","comment":[{"@type":"Comment","text":"How does the 64-bit instruction format compare with a packed 32-bit form once programs grow beyond these microbenchmarks? The extra operand space helps codegen, but the instruction cache may expose a different tradeoff.","datePublished":"2026-09-03T17:37:58.179Z","url":"https://daily.dev/posts/nSQme5HAY#c-a4rTDzk67","author":{"@type":"Person","name":"Agustin Barrientos","url":"https://daily.dev/agustinbarrientos","image":"https://media.daily.dev/image/upload/s--5ayxQnqn--/f_auto/v1788281802/avatars/avatar_wQYYVe5Tbj0NJ7C7qPoa8?_a=BAMAMicg0"},"interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1}}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/plush-s-new-register-based-interpreter-is-insanely-fast-nsqme5hay#faq","mainEntity":[{"@type":"Question","name":"Why are register-based bytecode interpreters faster than stack-based ones like CPython's?","acceptedAnswer":{"@type":"Answer","text":"Register-based interpreters need far fewer instructions because they operate directly on register slots instead of shuffling values between local variable slots and a temporary stack. Fewer instructions means less dispatch overhead, which is one of the biggest costs in an interpreter due to branch mispredictions. This is why Lua's register-based interpreter is known for being fast, while CPython and CRuby's stack-based designs are comparatively slow. Developers benchmarking interpreter designs can follow ongoing VM performance work like this on daily.dev."}},{"@type":"Question","name":"How much faster did the Plush programming language interpreter get after switching from a stack-based to a register-based design?","acceptedAnswer":{"@type":"Answer","text":"Switching to a register-based design alone gave a 1.55x geometric mean speedup, and additional optimizations like fused compare-and-branch instructions, immediate-value shifts, and constant deduplication added another 25% on top, for a total geometric mean speedup of 1.94x. Median speedup across benchmarks was 2.07x, with the maximum reaching 3.37x, measured on a MacBook Air M5 with rustc 1.96.0. Anyone tracking real-world interpreter optimization gains can follow benchmarks like these on daily.dev."}},{"@type":"Question","name":"How does the Plush language's performance compare to Lua, CPython, and CRuby on function-call-heavy benchmarks?","acceptedAnswer":{"@type":"Answer","text":"Plush outperforms Lua 5.5.1 by 24% on the fib benchmark and 55% on binary_tree, both benchmarks focused heavily on function calls. Lua is generally faster than CPython 3.14.6 and CRuby 4.0.6, but Plush's simpler, less dynamic semantics (immutable global functions and variables, tagged integers) let its bytecode compiler statically resolve call targets and fold constants, giving it an edge. Developers weighing language runtimes for performance-sensitive work can track comparisons like this on daily.dev."}}]}
```

