Starting new game studio! Prev. Wasm (LLVM) / FlatBuffers / games&VR at Google. Author of TreeSheets, PLs (Lobster, False, Amiga E..) and game engines (Cube..).

San Francisco, CA
Joined February 2009
After 8+ years at Google, I'm leaving to start my own gamedev company!
85
56
9
2,899
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/
5
30
3,693
Note: these numbers are already slightly out of date, numbers that include the latest optimizations are here: github.com/aardappel/goose/b…
1
146
Wouter van Oortmerssen retweeted
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/
2
2
49
2,802
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…
2
5
1
79
4,248
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/
2
41
3,616
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/
5
84
3,778
PSA: some crypto grifters have taken it upon themselves to create a "coin" for this project without my permission, even with my logo etc. I have not endorsed this, and am not associated with this in any form. If you are the creator of this "coin", please take it offline. Thanks!
3
2
1
28
1,451
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/
4
1
44
7,847
Generics and higher-order functions with no overhead. An untyped parameter is generic. Functions passed as arguments are compile-time entities, so xs.filter() { it > 0 } compiles to a plain loop. A block can even return from the function around it. 12/
2
1
33
3,798
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/
1
33
4,197
Everything is built in place, guaranteed. A value is constructed at its final destination through any depth of calls. Returning a growable array by value costs nothing: the callee writes straight into the caller's variable, or into a field of a record inside another array. 10/
1
33
4,006
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/
1
30
3,933
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/
3
37
4,880
Dispatch without vtables. Write one overload per variant and call it with the enum. The call goes through a jump table on the tag, and the compiler checks that every variant has its case. Add a variant and this stops compiling until you handle it. 7/
3
41
4,535
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/
2
1
45
5,561
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/
3
55
7,131
All of this is memory safe with zero annotations. No lifetime syntax, no aliasing or exclusivity rules, no unsafe. The compiler infers what every reference is rooted in and rejects anything that could outlive its owner. 4/
4
2
61
14,708