81 points bobbydigitales 1 hour ago 37 comments
bobbydigitales 1 hour ago | parent
The relative references and built in binary structure validation also enable direct memory mapping of data structures and immediate use of network data. "Parsing" file and network data is often 100x slower than it needs to be." - John Carmack
mi_lk 1 hour ago | parent
andsoitis 1 hour ago | parent
I could follow the link and read the thread and I don't have an X account.
You can also check out the language's website by googling "goose programming language", which should lead you to: https://aardappel.github.io/goose/index.html
mi_lk 1 hour ago | parent
cosmotic 1 hour ago | parent
celsoazevedo 41 minutes ago | parent
What X shows me: https://celsoazevedo.com/files/2026/x.webp
With a login/nitter: https://celsoazevedo.com/files/2026/nitter.webp
stefanos82 1 hour ago | parent
frangonf 1 hour ago | parent
AnEro 1 hour ago | parent
Aardappel 1 hour ago | parent
vanderZwan 59 minutes ago | parent
(And why isn't it Amiga E?)
Aardappel 26 minutes ago | parent
As for Amiga E, I am very proud of having made it way back when obviously, but it doesn't stack up against my more modern languages (Goose and Lobster), so I think I'll leave it be :)
fancyfredbot 50 minutes ago | parent
How are you deciding how many stacks to use?
Aardappel 45 minutes ago | parent
The programmer choose what to store where, so you typically store things in arrays by lifetime. Goose gives you many more tools to do that, it can store entire variable sized trees of an enum type in a single array.
You try to avoid having to deallocate in mixed/random order, but if you absolutely must, you can turn arrays into pools, basically.
fancyfredbot 19 minutes ago | parent
I'm a bit confused about how you could decide the number of stacks at compile time. I can see you could see how many arrays are lexically in scope. However if the code puts one dynamic array inside another dynamic array I can get to an unbounded number of total stacks without ever needing more than two in lexical scope at once. Do you also add stacks at runtime? Like a stack of stacks?
Aardappel 5 minutes ago | parent
AnEro 47 minutes ago | parent
Aardappel 36 minutes ago | parent
Once the initial compiler was there it became easier, as Fable is rather good of working within the context of what is already there.
AnEro 15 minutes ago | parent
ksec 47 minutes ago | parent
Do you know if Goose is the first time something like this has been done?
Aardappel 42 minutes ago | parent
There is lots of prior art on the individual parts of the design, e.g. "regions" and various stack languages etc, see: https://github.com/aardappel/goose/blob/master/docs/design/p...
Part of this is that 64-bit address spaces make this design practical, and almost all languages in use today were designed with the limitations of 32-bit in mind. Once you can assign arrays huge amounts of address space, you don't have to realloc, which gets you stable pointers, and a lot of the other Goose features.
amelius 43 minutes ago | parent
I'm wondering what kind of architectural corners this forces the programmer into ... have you found any so far?
Aardappel 39 minutes ago | parent
It certainly requires the programmer to rethink how they structure their data, as you have to think of where it is going to be stored, and how to store it in a way such that it will have similar lifetimes to what it is stored with, to get the most out of the language.
koolba 37 minutes ago | parent
> Nested data stays inline. A string, an array of strings, a record with variable-size fields and an array of those records are each one contiguous block with no pointer in it. A record that is 160 bytes and an allocation in C++ is 29 bytes and none in Goose.
I’m having trouble parsing that last sentence.
lynndotpy 33 minutes ago | parent
So, I read it as, "C++ uses 160 bytes and an allocation, when Goose requires 29 bytes and no allocation".
Aardappel 32 minutes ago | parent
Even Rust's "enum" feature, which can store different sized things all in the same space, does that at the cost of the smallest variant being just as big as the biggest.
Goose can do all of that not only inline (no pointers), but with variable size, meaning small items take less space. It's like a serialized data representation, but iterable. It makes for big space savings vs these languages.
koolba 29 minutes ago | parent
eslaught 20 minutes ago | parent
Doesn't that waste a lot of space? Or is there something I'm missing?
Also it would seem to force every allocation to go through the OS kernel to allocate unless there's some trick to avoid that.
lemming 27 minutes ago | parent
Aardappel 19 minutes ago | parent
With Goose, the core design favors speed over everything else. Though not only was I able to make that safe, it is fairly pleasant to use. But it remains a low level systems language that requires you to think hard about data organization.
Lobster is a waaay more high level language made to be pleasant to use first, fast second. Surprisingly though, it can get pretty close in speed to C++/Rust nowadays too, but still a lot slower than Goose.
lemming 16 minutes ago | parent
How have you found AI at writing Goose or Lobster code, if you give them a skill or something, are they relatively competent at actually writing code in the language?
Both are really interesting projects, BTW - thank you! I've been meaning to try Lobster out but haven't found time, I think this might be the push I needed.
nextaccountic 23 minutes ago | parent
how to perform this copy without atomics?
do the workers run as threads or processes?
also you claim it's faster than rust and c++. but for certain kinds of software it's certainly (and substantially) slower, right?
Aardappel 13 minutes ago | parent
The workers are threads. The separate memory is the concurrency model, but it's still single process, multiple threads.
The "faster than" is on average, and both in my own benchmarks and independent benchmarks you can find examples of algorithms where it is slower, but they tend to be the exception. "substantially" slower I haven't found yet.
geoffbp 1 hour ago | parent
ebiederm 33 minutes ago | parent
From what little I read in the literature I seem to recall that there were enough programs with quite a bit more memory usage that they decided this approach was a dead end.
Does anyone know anymore details?
Aardappel 29 minutes ago | parent
Back then though, they couldn't lean on large 64-bit address spaces like Goose can. They implemented all of this with a chain of blocks of memory instead, and tracked most of it at runtime that Goose now does at compile time.
https://github.com/aardappel/goose/blob/master/docs/design/p...