what language/environment would you design if you ...
# thinking-together
m
what language/environment would you design if you assumed a computer with 1TB of RAM, 1PB of disk and 1024 cores?
👏 2
4
c
might be enough for npm
😂 13
A big data notebook comes to mind, still not much different UX-wise, just happens to have a supercomputer under the hood But I'd love to see a visualization of how the machine performs the operations I've sent it, so that I can see bottlenecks and really build up an effective processing pipeline through the notebook
A different idea: I'd love an environment where I could share pieces and say to friends "this could be your server", whether for discourse, for solid, as a file share, etc - just a fun way to say "let's share this big machine in ways that people have typically needed a server in the past"
❤️ 2
k
@Chris G check out the Tilde movement if you haven't already: https://medium.com/message/tilde-club-i-had-a-couple-drinks-and-woke-up-with-1-000-nerds-a8904f0a2ebf I'm on http://tilde.club and a couple of others. It's particularly nice for trying out new and strange OSs. For example, https://tilde.institute has several Plan 9 tools installed (though more can be done here to give people a portal into an alternate universe).
😲 2
i
Hest
🍰 5
🤣 1
k
@Mariano Guerra first thought that comes to mind: you'd need a lot more attention to sandboxing, just because you'd be likely to be running a lot more heterogeneous software on such a machine. Sandboxing in particular is something the current stack is abysmal at.
w
@Kartik Agaram makes a good point as that one rouge process breaks the window server. With silly resources, I would try to adopt designs that perform extensive speculative execution. For example, the web browser fetches and renders all the links so that when I finally click on one, it's already ready. Sandbox becomes more important so as to model destructive possibile futures. Assuming this fantasy setup doesn't have a magically fast clock, we only get a benefit from parallel execution. The programmers are never going to have time to write stuff to run well in parallel, so instead of twiddling its thumbs, I'd have the system proactively test rewrites. Amounts to a machine that perpetually asks itself, "why am I so slow?"
👍 1
m
actor systems with message passing and lightweight processes like the erlang vm take advantage of the extra cores for free
k
Erlang would indeed be suited to 1024 cores. I don't know enough about it to comment on the RAM/disk specs..
m
each process has its own heap and garbage collection, so it should scale there too
s
Whatever I do, would probably use Rust for that
s
how much cache on that computer? and what do the cores look like? Small out of order cores with lots of SIMD units? cell style spus? something weirder? I'm assuming they probably look like "regular" CPU cores in a modern x86 or ARM CPU
☝️ 1
also 1 PB disk, 1 PB SSD?
I like the idea of a message passing erlang style environment, also maybe more of a GPU style programming environment that's SPMD, maybe they communicate by writing to a shared L2 cache that is functionally similar to group shared memory
with explicit barriers
c
Guys invent something new with your mind, that's the invitation on this thread
🤣 3
l
i think the first question for me is "what would you do with that machine that you can't do with the one in front of you?" Analyzing DNA would be a nice fit. Since this is a fantasy, i would attach one machine directly to each sequencer rather than sending data over the net. Now i could start to think about what that language might look like.
❤️ 3
d
If processors were as "free", then they could be allocated like memory. Each object gets its own brain, and can spawn others.
2
If I had a very different new architecture, I'd model objects (lists and key-value stores) (and single values) directly in the hardware. The links between object references would be literal (conceptually, if not actually). Garbage collection would automatic, as each "object" cell would constantly propagate an "alive" signal (bit) to whatever it references. The moment an object is not connected to another "alive" object, it frees itself to be reallocated. There is no way to reference an object by "address"; only by following a link from an object you already have a reference to. In theory, if the instruction set was very small (e.g. all the operations for manipulating these objects and primitive values), then each "memory cell" would have it's own little processor, and correspond to one object (conceptually, if not actually). With this model, a computer can be more like fabric, and objects and processes can just "walk" it, like entities in the game of life. They could transfer from one environment to another so long add there was a connection, just like you'd transfer around objects in the physical world.
❤️ 2
1
Or perhaps a similar but different idea: If you model code as a DAG, and it's pure-functional, and the dependencies from one expression to the next were all represented physically, then changing a value upstream would cause everything downstream of it to recompute itself automatically. The only processing effort is that each is constantly outputting some function of its inputs. I guess it's like digital circuitry, but at a higher level, and dynamically allocatable at runtime
2
If that's all outside the limitations of the question, then I'd use that computer to simulate / POC systems like the ones I've just described
k
Follow-up question for @Mariano Guerra after reading @Dan Cook's response: do we care about carbon footprint? Social assumptions make a big difference to the answers here.
2
e
@Dan Cook Have you heard of the Rekursiv project? I recommend trying to track down a used copy of the book.
d
Will do!
s
"The last known copy of a Rekursiv computer ended up at the bottom of the Forth and Clyde canal in Glasgow." - Things sometimes do not go as planned. I have heard of this project before and was very interested in it but then life took on. Thanks @Eric Gade will look at it again
m
@Dan Cook sounds a little bit like the propagator from sussman:

https://www.youtube.com/watch?v=Rk76BurH384

👍 1
@Kartik Agaram as much as the society at that point in time
o
@Dan Cook I share your views here. It is good to have you back! ☺️ Or you are not really back, but you can't help but answer this very interesting question!? 😅
✔️ 1
I guess the intent of the question was what to design if the resources availability is not a problem. Either it is not a problem to have any amount of resources (RAM, disk, number of cores but other kinds too, more about it below) and the environment and societal impact is low. On the resource side, first I would add other kind of resources. Mainly interface resources. I.e. the computer has advanced HCI system. Not only mouse and keyboard but as much cameras and sensors needed to have better interactivity and help make it more tangible. As, for example, one where it is fast and easy to capture hand gestures. Then, I would consider that people that have to collaborate with the language/environment, and that are not in front of the same computer, all have powerful computers that are all efficiently connected. So I will answer on that basis!
❤️ 1
The environment will use CRDT like technology that construct the state of the system from its history. So the entire multiuser history is stored. Of course the programming/editing history, but also the executing history. Or some part of it, leaving aside what is still too resource intensive (like complex video playing/processing maybe) and less "useful". In fact, in that kind of system the boundary between programming/editing and executing is blurred. In that environment, there is a focus on making things as tangible as possible. I.e. your programming artifacts are alive, you can see them and manipulate them interactively. Some might not be possible to be really alive and tangible, but in that case everything is done to simulate them as realistically as possible. For example, if you are designing a complex infrastructure architecture, it is not always possible to make it tangible, in that case there is some simulation of it, so, as much as possible, things can be "tangibly" designed before making them concrete. So I guess, part of the environment, there must be a serious and flexible "simulator" facility. With the system being aware between what is really tangible/moldable and what is just simulated and needs to be brought to life at some other time.
e
@Dan Cook and @ogadaki these both sound very similar to what I’m working on. A visual/notebook based purely functional programming development environment with live data and time traveling for both previous inputs and each step of a run that uses CRDTs for collaboration. Seeing it on this thread has me worried that this may be pushing the limits too much for what’s currently feasible? I’m using Rust targeting wasm in browser. Is this possible now? Do I need this beast machine to make that happen?
o
From my understanding, one pain point with CRDT is rebuilding state from a very huge history logs. With a beast machine the problem will arise later. But depending on your real use case, I guess it can work right know. And there are some strategy to mitigate this. Maybe you already know his work, but here is a video by Martin Kleppman talking about the "hard parts":

https://www.youtube.com/watch?v=PMVBuMK_pJY

👍 1
e
Yeah, @ogadaki scaling over time/a large history is definitely a challenge in CRDTs from what I’ve gathered, both on playing catchup if you’re say a year behind and for just loading all of that into working memory even if have an up to date local copy. I really appreciate you pointing me towards Martin Kleppman! I’ve been looking into his work, and I’m on the Automerge slack channel and I may get involved in their Rust port implementation. I’ll have to check this video of his out 😄
👍 1