If anyone wants to chat about my new Goose programming language, the #goose channel in the Lobster discord is for now the place to be! discord.gg/szJPYdX
Ok, seemed people preferred a dedicated Goose Discord after all: discord.gg/397eZdbnsR
Threads that share nothing. A worker is compiled as a separate program with its own memory.
Flat values sent in typed queues as a memcpy (since Goose values are contiguous). No data races, locks or atomics.
13/
Note: these numbers are already slightly out of date, numbers that include the latest optimizations are here: github.com/aardappel/goose/b…
And for those that have complained that my benchmarks may be biased, here is Goose in some independent benchmark, where it runs at **almost twice** the speed of C++/Rust, much greater than my own benchmarks: github.com/kostya/LangArena/…
Been experimenting with Goose and built a modern UI, a small editor/Git workbench, and HTTP(S) support.
Still early, but it’s been fun building some practical things with it!
Goose: my latest programming language. Safer, faster and less memory than Rust/C++ for algorithms where tightly packed, flat data structures matter.
It can represent more kinds of data structures as flat, pointer-free bytes than any language I know.
github.com/aardappel/goose
1/
Wouter van Oortmerssen retweeted
Goose (xitter.cf/wvo/status/21079796605…) beats Milo on all five of its benchmarks on the largest inputs (1% to 34% faster) and uses less memory on three, up to 3.9x less. Impressive work @wvo.
Milo: fast like Rust, simple like TypeScript. A memory-safe systems language on a new point of the tradeoff curve: no GC, no lifetimes, one owner per value.
Also: SMT-proved contracts, reverse debugging, packages, 86 std modules, checked FFI, LSP.
github.com/milo-language/mil…
What it costs you: you think about who owns data and how long its scope lasts. Recursive functions cannot keep growable data across a recursive call. Arrays of variable-size elements iterate but do not index. No escaping closures or function pointers. Whole-program only.
16/
I designed Goose years ago but never had time to finish it. Claude Fable implemented it almost entirely from that design, and the back and forth made it a better language.
Today: a 30k line compiler, spec, stdlib, 29 samples, CI on 3 OSes. Start here: github.com/aardappel/goose/b…
17/
Errors without Result, without exceptions, without ? on every line.
return err from load returns from a function any number of frames up. It is checked at compile time, so nothing is uncaught at runtime, and every function in between keeps its plain signature.
11/
Links can be narrower than pointers. A relative reference stores a typed, checked link as a 1, 2 or 4-byte offset.
Here is a binary search tree in one grow-only array, 12 bytes per node, no allocation per node. The push cannot invalidate cur, so an insert is one store.
8/
Those links are offsets, so the structure is position independent and can directly be used as serialized data.
Saving is writing the bytes. Loading checks every tag, length and link before the bytes turn back into a value.
9/
Enums come in two sizes. Fixed mode is what Rust and C++ do: every value as big as the largest variant.
Variable mode (Shape..) gives each value its own size, and lets you point into a payload and edit it in place. 4x less memory and 2x faster than a Rust enum.
6/
Nested data stays inline. A string, an array of strings, a struct with variable-size fields, an array of those structs: each is one contiguous block with no pointer in it.
This order is 29 bytes and 0 allocations. In C++ it is 160 bytes and 1 allocation. In Rust, 153 and 4.
5/
Nothing ever moves. A reference into a growing array stays valid as long as the array does, compiler checked.
Vec and vector reallocate, so Rust and C++ fall back to u32 indices into an arena. Goose code just keeps typed references.
3/
























