Releases: mvm-sh/mvm
Release list
v0.5.0
Changes since v0.4.2
- doc: update to v0.5.0 (15a53ca)
- fix type layout, increase number of stubs, regen compat matrix (ac52f50)
- fix anonymous struct field type name, slices, receiver (13e3bbb)
- fix exported const of unexported named type (f3c35d1)
- fix embedded interfaces (25da927)
- goparser: fix generic instanciation (1ae3e22)
- stdlib: caller-skip in runtime, synth shape for ServeHTTP (79fac4e)
- fix interface wrappers (e319992)
- fix typed const, parsing constraints (3962c5c)
- skip test depending on FMA on gonum.org/v1/gonum/plot (32efeca)
- fix untyped const (4ad1341)
- stdlib: add sub-word packed structs (a5877c9)
- add float support to word-shaped stubs (1651953)
- fix forward declarations in RHS (c712281)
- update compat matrix (c20a149)
- fix const extract, regen stdlib wrappers (72c40f5)
- comp: improve interface method resolve (43cfce9)
- vm: intercept call to runtime.Goexit (f0d101d)
- vm: add GreaterEqualFloat/LowerEqualFloat (8c5a4b1)
- fix import aliasing keys, normalize panics (8e9f35f)
- stdlib: add some word-shaped stubs (3d1375a)
- fix float32/complex64 constant overflow, method expressions (eaad2af)
- stdlib: more stubs (65ac984)
- add word-shaped stubs for some interfaces (2f0a312)
- fix make cover (avoid go internal compiler error) (5ed737c)
- refactor tests (51faf04)
- vm: fix constant type in set expression (b8b2695)
- comp: fix return followed by a logical expression (7c72080)
- comp: fix interface method resolution to use symbolic type (ffa8d21)
- fix embedded field type, promoted native methods (640d179)
- fix embed recording, reservation ordering (496a8ba)
- fix reflect type materialization for complex types (9aafa2d)
- compat: update (9b24373)
- compat: add categories (fdb009c)
- compat: increase external packages to grpc, gonum (dbd685d)
- fix map keys from const, **reflect.Value (662d5ac)
- mtype: fix interface satisfaction signature matching (06dd01b)
- stdlib: add new word-shaped stubs for gonum/graph (d2b44b1)
- goparser: fix multi-assign on '_,ok' type (cef027d)
- fix iter on maps (324ca24)
- fix interfacce method inferencce (b9df7d1)
- handle Ctrl-C in tests (b9c1afc)
- comp: fix untyped numeric constant to default to float64 (3f043e8)
- fix aliasing func parameters, skip long running gonum/mat tests (ee66154)
- modfs: cache network imports (707d8da)
- refresh local-var symbols at unit entry (686a12f)
- improve embedded interface in struct (09176ac)
- vm: fix struct embedding interface (6ba56eb)
- vm: fix use of named scalar at reflect boundary (38c08c1)
- increase synth method table, fix slice identity loss (6c3f691)
- fix captured var in select, reroute readfile through modfs (8a851c2)
- goparser: evaluate LHS in op-assign only once (0f9e96a)
- comp: fix stack overflow in defer expressions (8c5d571)
- improve interface bridging (971d4d8)
- fix extract package name (71f050f)
- fix undiscoverable tests (5978e5e)
- fix pkgname encoding, add new stubs (efd3b57)
- comp: fix rebind on define (ca73acf)
- comp: fix code generation (27d0f99)
- vm: fix iter.Pull2 with less than 2 vars (1e98271)
- stdlib: add new word-shaped stubs (f37fded)
- comp: fix cross-package init ordering (7180c8a)
- comp: fix promoted method through embedded interface field (1ac3810)
- goparser: fix named native type (2e10e4c)
- goparser: fix forward type in struct field or func (67dc2d1)
- goparser: fix pkg qualifier (6ddffde)
- fix package import names and resolution (5ce9b13)
- improve handling interfaces (c28851b)
- vm: fix bridged pointers in generic instances (fa94fe0)
- goparser: fix multi lhs assign (074bb69)
- avoid race in materialize (725d4d7)
- stdlib: add stub for net.Conn (1b47e46)
- vm: fix IO interface (6f71aa9)
- vm: fix map of deep interfaces (55bf1c0)
- rework log wrapper to keep bridged interfaces (6e3c99d)
- add new word-shaped stubs for netConn (383e8bd)
- fix type convert, regenerate stdlib wrappers (018b2ea)
- fix receiver detach for defer (83b26f7)
- fix unexported promoted method, MaxInt32 overflow (b883e13)
- stdlib: skip protobuf/proto alloc tests (5b69f59)
- vm: fix keys for interface-typed map (c3ce186)
- vm: raise panic in case of nil deref (62ddd6c)
- goparser: fix type identity in deref expr (f61714d)
- goparser: fix unsafe pointer deref (0c0537c)
- vm: add more reflect constructor intercepts (92163b2)
- add reflect.Type.Method intercept shims (0ebf370)
- fix method-bearing derived structs (35cce33)
- generalization of type materialization fixes (36d6ea3)
- fix type materialization (2430bbd)
- fix generic type inference, update matrix (66f6eeb)
- vm: fix promoted method on nil pointer receiver (c3ab512)
- goparser: speedup local var indexing (3bb94bd)
- Merge branch 'main' of github.com:mvm-sh/mvm (544b636)
- dump stack on Ctrl-C. Ctrl-C again to quit (b8095e0)
- print compiler stats with MVM_DEBUG_COMP (229aa90)
- goparser: improve speed of method resolution (8d0bf6e)
- compat: refresh matrix (2026-06-15) (36c1378)
- comp: fix composite with nil slice/maps (9d0dc04)
- mtype: fix compatible type check (7d501cb)
- goparser: fix check generic constraint (7802553)
- interp: fix synth types slot reservation (54af495)
- com, interp: fix ordering of package inits (5bfd805)
- fix test recompile (1c03b20)
- fix test reparse (31222b9)
- improve tests (1cb0b86)
- speed up test in case of skipped test files (30e232c)
- vm: fix embedded interface (c57b130)
- fix make (da535af)
- goparser: fix self-referential generic types (b5b0102)
- add more stubs for grpc (3996f29)
- goparser: fix qualified composite types (c09b0e6)
- vm: fix assert with nil ptr (5a05e87)
- goparser: fix reused declared type (c741da2)
- vm: fix recursive types (f455938)
- goparser: add support for //go:embed directive (2240f10)
- stdlib: increase size of word-based stub pool (fdb79c7)
- vm: the protoreflect FileImport blocker (c44608b)
- goparser: fix blank const (0e5c480)
- goparser: fix type/var collision due to autoimport (a58bd26)
- additional fixes for gonum (888634a)
- fix operand type misinference, compares, nil (6ade433)
- add arithmetic operators for complex, fix import collision (f3e5f87)
- Merge pull request #35 from mvertes/word-synth2 (ba79d42)
- compat: update matrix (82dcf7f)
- fix typed nil comparison (3c217e2)
- fix pointer-receiver method expressions (8413e9c)
- fix named return slot zeroing (c4268a8)
- vm: strong funcFields for funcvals lifetime (4687e1f)
- vm: add trampolines for reentrance calls (8c44d8d)
- vm: fix interface wrapping for iterators (734a190)
- vm: fix crash on method receiver (312f8d4)
- vm, runtype: improve resolve dispatch for methods args (f9f8806)
- second attempt to word-based dispatch (210a9a4)
- fix self-referential and composite types (32006db)
- stdlib: skipp noalloc tests in xxhash (803be01)
- fix spread calls, multi-assign, redeclare, global blank (8d56a5e)
- compat: update matrix (bf08988)
- fix synth stub recv argument (80a54da)
- fix in TestMain and vm.assignSlot (946413f)
- symbol: fix MethodByName ranking (2fe9f9d)
- vm: fix a synth-bridge receiver bug (c478acd)
- compat: refresh matrix (2026-06-11) (ba40e80)
v0.4.2
Changes since v0.4.1
- vm: fix unboxing interface values (6f639fd)
- comp: fix an issue in returning nil (cd91fd8)
- fix nil channel, map of pointer, captured pointer (48b24d4)
- goparser: avoid label collisions (7f42dbe)
- fix collisions between labels and vars, add stub for rune (3c7f23a)
- fix switch operand stack leak, variadic spread and materialize (10af5d9)
- goparser: fix issues in arrays and interfaces (4dd1a2d)
- stdlib: fix incompat checks for sync (ac56846)
- vm: fix deep unbox cycle hang, fix incompat checks (40fe327)
- goparser: fix assign forms in range (6349a53)
- vm: fix typed nil func wrapper (f4c9bbd)
- fix type identity for synth methodless named types (5e8e9f4)
- fix comp rollback, MethodByName, symbol lookup (2e337e9)
- comp: fix handling const in shift operators (f4008bb)
- stdlib: add stubs for log/slog interfaces (8dc4a15)
- fix interface wrappers (8a8ee4f)
- vm: fix promoted synth methods (db374ab)
- vm: fix promoted synth methods (a833114)
- fix cell pointers and conditional promotion (eb93824)
- vm: fix TypeBranch for native interface (39e61ec)
- comp: fix SetGlobal (75e6ca3)
- improve deferred panics and diagnostics (74031c6)
- vm: improve native panic diagnostic, fix variadic values (f0f3a3c)
- provide shims to call asm funcs, like syscalls (1c6478e)
- vm: fix data race in type materialization, by mutex (3c3df97)
- compat: refresh matrix (2026-06-09) (3166c6b)
v0.4.1
Changes since v0.4.0
- release v0.4.1 (a534e40)
- stdlib: skip long tests in golang.org/x/text/unicode/norm (3b7e94b)
- vm: fix MkMap to apply len and cap args (9408d95)
- fix mutual struct cycle causing OOM (eaf75e9)
- goparser: fix placeholders for forward declarations (9dbc22a)
- fix lint (d563f34)
- goparser: fix generic type param collision with package symbol (fc9e70d)
- goparser: do not allocate parameters in func type declaration (9d00270)
- fix typed converted numeric values (84ce582)
- goparser: fix pointer in literal composite (b2d33b1)
- chore: lint modernize (4cc8db0)
- fix lint (999adfd)
- vm: fix iterator memory leaks (aae60f7)
- goparser: fix switch/select case clause (e710bf4)
- stdlib: skip long tests in github.com/oklog/ulid/v2 (1265c46)
- Merge branch 'main' of github.com:mvm-sh/mvm (9ef5fd8)
- goparser: detect redeclaration and prevent clobbering (e8f1a6e)
- compat: refresh matrix (2026-06-08) (a8d23a9)
- vm: fix in send in channel, improve goroutine diagnostic (8e49cdc)
- improve typeswitch and test command (61d94a0)
- comp: fix defer for expression call (8717597)
- eval: fix a reentrance issue (460ea41)
- vm: make sure values read from unexported field are writables (b0d3f1d)
- fix parsing postfix index (df87bd4)
- goparser: correctly identify postfix index (609f9ba)
- goparser: enhance diagnostic in case of parse error (e541d48)
- test: execute interpreted external tests in addition of internals (9017b86)
- update compat matrix (a104093)
- fix some issues on self-referential types (25be6b0)
- vm: fix setting name on self-referential fields (4574874)
- symbol: fix promoted methods on recursive struct (ac11ba8)
- fix file by file compile in test harness and build constraints (1fb8907)
- goparser: fix generic forward ref instanciation (0c991b3)
- generics: simplify mangling (28e69a3)
- generic: fix inference through named generic instance (61b9d80)
- vm: maintain value identity for interpreted funcs (a20082c)
- update compat matrix (d28cd73)
- compat: refresh matrix (2026-06-05) (86f66c8)
mvm v0.4.0
mvm v0.4.0
Mvm is a Go interpreter: it compiles source to bytecode and runs it on a stack
VM, ships as a single static binary with the full standard library bundled in,
and embeds in Go or C host programs. Status is still alpha.
This release reworks how interpreted types meet native Go code, grows standard-
library and third-party compatibility substantially.
Highlights
- Native-speed interface dispatch. Method dispatch now synthesizes a real
Goreflecttype carrying the interpreted method set, replacing the old
per-call interface-bridge + argument-proxy layer and ~1800 lines of
hand-written shadow packages. An interpreted type can now satisfy several
native interfaces at once (e.g.Stringerandjson.Marshaler), and
reflect-walking native code sees interpreted methods on nested struct fields.
(ADR-021) - More real Go runs. 90 of 169 bridged stdlib packages and 16 of 50 curated
external modules now pass their full upstream test suite undermvm test,
with many more passing a majority. Newly green this cycle includeerrors,
text/tabwriter,log/log/slog,html/template,io/fs,runtime/debug,
andgo/types. - Preliminary complex numbers, multi-file
mvm run a.go b.go, and
cross-language benchmarks (Go, Lua, Python) underbench/. - Faster. Sieve of Eratosthenes drops from 100 ms to 32 ms (-68%), beating
lua5.4on that benchmark by ~14%.
Notable changes
Changed
- Generics inference reworked: type parameters bind through the symbol table by
identity rather than name-substitution, closing a class of inference gaps
(slices/mapsnow infer at parity withgo build). - Interface satisfaction is signature-aware (
Unwrap() []errorno longer
spuriously satisfiesinterface{ Unwrap() error }). slices,maps, andtesting/quickare now fully interpreted rather than
bridged.
Fixed
- The zero value of a
map/slicevariable is now nil, matching Go; composite
literals andmakestay non-nil, and a write to a nil map is a recoverable
panic. - Remote modules with a major-version suffix (
v2+) resolve correctly
(e.g.github.com/blang/semver/v4). - Many parser, generics, numeric, and native-boundary fixes.
Removed
- The hand-written shadow bridge packages (
errorsx,fmtx,jsonx,xmlx,
gobx), superseded by synthesized rtypes.
Full details in the CHANGELOG.
v0.3.0
mvm v0.3.0
A Go interpreter that compiles to bytecode and runs on a small stack VM — single
static binary, full standard library bundled, embeddable in Go and C.
Added
clearbuiltin (maps and slices) — the last builtin mvm was missing.comparableas a generic constraint, plus broader generics-parsing improvements.mvm run <import-path>fetches and runs a remotemainpackage; trailing args
become itsos.Args.mvm testruns and validatesExample*functions (output checked against the
// Output:comment), and-bench REGEXruns benchmarks through nativetesting.-statprints compile/execute statistics on bothrunandtest.interp.ExitErrorlets embedders catch interpretedos.Exit/log.Fatal*as a
typed error instead of terminating the host (ADR-018).cmd/mvmlint, a small linter for mvm-specific code patterns.- Stdlib bridges for
encoding/gob;encoding/xmlround-trips via a newxmlx
shim (interpretedxml/Textmarshalers work through nativeencoding/xml
in both directions). - Native method hooks and composite interface bridges (one interpreted type
satisfying several native interfaces at once). - Test infrastructure to run the Go standard library's own external
_test.go
suites against mvm's reflect bridges.
Changed
- Exit virtualization (
os.Exit,log.Fatal*) is now unconditional and wired
automatically on the firstEval(ADR-018). - Load/parse/compile errors report
file:line:colwith a source snippet and a
caret; runtime panics print a unified interpreted + native stack. mvm test -statprints the stats block after the test output, just before
PASS/FAIL.- Build targets split:
make test(race only),make cover(coverage), and a new
make fast(-short+ race) for a quick inner loop.
Fixed
Numerics (untyped-constant/float mixing, zero value, per-frame cache),
pointer-receiver method lookup and interface wrapping, type switches
(TypeBranch + interface-wrapper edges), and generics/inference (no type loss in
multi-return; inference on func-typed params), among others. Full list in
CHANGELOG.md.
Also new: a live compatibility matrix
https://mvm.sh/compat — mvm now runs the real test suites of the standard
library and ~50 popular packages through the interpreter every week and publishes
per-package pass / partial / fail with a trend over time. ~96% of individual test
cases pass today; the generator is itself a Go program run through mvm. Honest
numbers on purpose.
Try it in the browser: https://mvm.sh/playground
Install: go install github.com/mvm-sh/mvm@latest
Questions & feedback: https://github.com/mvm-sh/mvm/discussions
v0.2.0
Changes since v0.1.0
- add CHANGELOG.md (e651dd6)
- comp: improve range error messages (c074d7a)
- goparser: handle mixed keyed/unkeyed slice elements (1bc62b7)
- vm: add CallImmFast for non struct/array args. Clean dead code. (faf4008)
- fix handling import to _ (aaac727)
- vm: fix races around ActiveMachine (4fd7def)
- vm: fix races around ActiveMachine (3f13f72)
- vm: address ActiveMachine races (a70218a)
- vm: fix interface bridges for identical structural types (8314289)
- comp: fix multi-return assign and numeric convertion (3c499ef)
- fix transitive capture for nested closure (19e9ed4)
- test: chdir to source. Also handle nil receiver. (45a547c)
- vm: fix passing wrapped array/struct by value and receiver methods (39a1372)
- vm: fix an issue in IfaceWrap (e3a3b69)
- vm: fix truncation in shift, and not (&^) (cc98050)
- revert previous and instead fix qualified method lookup. (52d4c0e)
- comp: detect passthrough for native callbacks (63d792d)
- vm: handle concurrency in CallFunc according to Go spec rules (95e35d5)
- vm: refactor CallFunc to avoid per-callback allocation snowballing (9a322a7)
- goparser: fix cross-pkg func name collision. Improve test runner. (51e4618)
- goparser: fix an issue in reuse stale LocalVar symbol (713466f)
- vm: fix an issue in Value.Equal (5b38b6e)
- vm: fix issues in bitops (e85c094)
- vm: virtualize reflect.ValueOf to preserve mvm metadata in methods (31df0db)
- fix an issue in interface bridging (79773d8)
- comp: fix an issue in globlal var slot allocation (14435db)
- fix an issue on ':=' rebinding (2037dbf)
- add support for reflect.TypeFor (04a4ef9)
- fix an interface dispatch regression on native types (cf9d3d3)
- fix a regression introduce by qualified name symbols refactor (a90b667)
- improve transitive import of packages (ce8aa68)
- fix a spurious bytecode fuse (3343bc2)
- goparser: used fully qualified symbol names to avoid collisions (1543a72)
- refactor symbol naming for cross-pkg definitions. WIP (eef891c)
- fix issue in cross-pkg definitions. WIP (15fab96)
- fix cross-package issues in handling func/label (0ebbc1a)
- fix an issue in interface bindings (db782e6)
- goparser: avoid same var names collisions between different packages (1c321c5)
- improve parsing of composite literals with array-type keys (d54dcf0)
- goparser: fix issues in block and composite parsing (777734b)
- scan: provide source content access methods for inspection (488a465)
- goparser: fix an issue on handling methods on typed constants (c6f3074)
- fix a SIGSEGV panic on import "golang.org/x/text/language" (a70cfb4)
- update docs (16815d7)
- goparser: add support to '// +build' old form of build tags (867a74c)
- fix: error instead of panic in case of malformed expression (278f345)
- stdlib: isolate symbols brought in go1.25+ for compatibility (6c948e2)
- fix an issue in parser which was hanging extract on net/http (0526a0c)
- cli: align test flags on "go test" (84ccdab)
- docs: update, add usage.md (a57c017)
- vm: improve trace layout (97f3bef)
- vm: move some opcode out of Run() to release register pressure (e6e8397)
- simplify -x trace flag. Add ability to trace bytecode execution. (e9765b8)
- vm: add tracing mode in Eval on -x or MVM_TRACE=1 (c7cc6e3)
- CI: pin golangci-lint to reuse it (6cc73ee)
- CI: skip regenerate all stdlib at each commit, add periodic check (3ca524b)
- improve stdlib generation by extract (41ec2c0)
- skip comments at scanner level, no need to filter them in parser (bb41f29)
- fix a regression in comment handling in type expressions (cf5d739)
- update docs. Remove comp/dump.go (41be6b6)
- CI: install stringer for generate (c55a65a)
- drop matrix, full generate for go1.26 (c04c762)
- generate stdlib and stdlib/src.zip (aea4ca7)
- use github.com/mvm-sh/std as the module to provide stdlib packages. (0d440cc)
- update stdlib wrappers to go1.26.3 (0c12eaf)
- Improve stdlib bridges and wrappers for named slices (1955db3)
- fix vm intercept side table to use uintptr, no unsafe (d986360)
- fix embedded method bridges (513ac9e)
- fix CI test failure with arithmetic pointer error (1a01cdd)
- add errors bridge (36253f9)
- improve stdlib bridges and wrappers (d204f8d)
- fix parse literal composite field names, avoid comp rollbacks (3476879)
- improve closure naming, vm sentinel collisions, errors.Is (42e96fb)
- fix an issue in composite literals with non-constant keys (0820cfd)
- bound size of runtimeFuncMeta used in virtual frames (9fa207d)
- virtualize callframes and intercept methods at native/interp boundary. (209facb)
- stdlib: add format bridge for fmt.Formatter (4304799)
- improve interface bridges to mix native interfaces and scripted methods (31cce8f)
- fix handling methods on pointer receivers (4fcbb9b)
- vm: allow interface methods on unexported fields through unsafe (39cff31)
- improve handling of defined types in struct, embeddded and composite (c59122f)
- fix comment handling in blocks and before statements (902e544)
- scan: fix handling comment line, no ';' insertion in that case (9f04527)
- add version command, update issue templates (5544a84)
- update readme, add issue template for one liners (03b6235)
- scan: emit only one semicolon for multiple blank lines (8590df5)
- fix multi-value index assign, interface bridges for equality (566e9fe)
- Optimize var deps analysis by calling it only when necessary (6cb778d)
- improve var init ordering analysis in parser (308d546)
- fix test driver by ordering test func names (41b5aea)
- fix reflect.DeepEqual and '==' in presence of wrappers (a5044ad)
- Fix method metadata loss in cross-package types. Improve jsonx. (6845ff7)
- fix zeroing local vars after grow for pointer on struct (434cbec)
- apply dynamic network imports to test command, update docs (39edc91)
- comp: improve error diagnostic and file positions (5c98a68)
- improve interface match for concrete types (bfd2802)
- goparser: fix comment handling in case clauses (c07126e)
- goparser: improve diagnosing parsing errors and file positions (790a3fd)
- Merge branch 'main' of github.com:mvm-sh/mvm (8e45d3f)
- add support for dynamic network imports via Go module proxy (14e451c)
v0.1.0
Initial release.
Commits
- setup a release workflow (4a94968)
- simplify implementation of test command (db1fb0f)
- Add shebang support (399c862)
- cosmetics (34cf2f4)
- fix lint (eb2b881)
- vm: inline Grow in Call/CallImm when possible (b1c7721)
- fix stdlib changes between go1.25 and go1.26 (0f2d6a1)
- extract: Adjust buildtags to support both go1.25 and go1.26 (c294bf4)
- fix CI to use go1.25 and go1.26 (fadbe4b)
- update docs, format extracted files, improve README. (332ad65)
- update README (fd5d4d4)
- add more examples, a new CONTRIBUTING.md and fix README.md (6b24cd2)
- checkin stdlib categories (43e302e)
- fix stdlib lint errors (d53efb0)
- reorganize stdlib in a trimmed core, and remaining ext sub-packages. (887e5a9)
- add a BSD-3 style license. Update README (0938432)
- fix extract and add missing stdlib bindings. (cec7007)
- add various tests in _samples/ from parscan (bfc12bb)
- import cmd/extract from parscan (838dca5)
- initial import from mvertes/parscan commit d7aa040 (c861d89)