I think I finally understand what Urbit is.
Urbit is a functional and deterministic VM, which operates as state transitions triggered by incoming events, returning output.
I think it also has a network/crypto/identity layer for communication between VMs
Urbit is a functional and deterministic VM, which operates as state transitions triggered by incoming events, returning output.
I think it also has a network/crypto/identity layer for communication between VMs
Though I'm unclear on this, I'm guessing all the Urbit apps are HTTP apps. I suppose in theory other I/O could be defined for the VM, but it's not like it's going to start specifying pixels to go on a screen. It's super-not-realtime, like they tripled down on that.
I guess the VMs are just a big hunk of bytes (or positive integers), and each operation also includes the new big hunk of bytes, including all persistence and programs and OS. So I suppose at any moment it could all just self-destruct.
The VM has a bytecode, called Nock, which apparently has a very silly design. I feel like it's based on the 100-Year Language http://www.paulgraham.com/hundred.html
But the real way things work is that u3, the Nock interpreter/VM runner, looks for patterns in the Nock code and replaces them with its own C implementations. This includes simple things like subtraction (not a primitive), or very big things like an entire Markdown renderer
u3 calls these replacements "jets", which are ideally just optimizations. Without jets nothing can run in any reasonable amount of time. Time, memory, and resources are not part of the Urbit guarantee. But jets are also the secret FFI that they pretend doesn't exist.
I guess one idea of Urbit is that computation should be portable, which given a VM image with deterministic properties, is potentially portable. The identity and networking layer mean you can actually move it around while maintaining its identity.
What happens when you copy a VM? Which instance is in charge? Unclear. But it seems like the way you actually use Urbit is just running u3 on some Linux server in the cloud, so there's no currently available future fantasy where computation is portable.
When reading about Urbit there's a lot of discussion of the identity scheme, because it's a certification chain with limited roots ("galaxies") and a 32-bit address space (weird!). So controversial,, but not actually that interesting.
Oh, there's also a functional language built on Nock, called Hoon. Like everything else in Urbit it looks crazy. Or the better term I've seen: obscurantist. E.g., all its syntax is with "runes", their name for the punctuation that makes up their keywords.
Of course anyone could write another language that compiles to Nock, but AFAICT no one has. And actually they can't, because u3 detects and optimizes specific series of instructions, and so any compiler and u3 are strongly coupled.
Here's the articles that were helpful to me:
https://medium.com/@noahruderman/review-of-urbit-e7cc4c35f149
https://urbit.org/blog/common-objections-to-urbit/
http://ngnghm.github.io/blog/2016/06/11/chapter-10-houyhnhnms-vs-martians/
https://medium.com/@noahruderman/review-of-urbit-e7cc4c35f149
https://urbit.org/blog/common-objections-to-urbit/
http://ngnghm.github.io/blog/2016/06/11/chapter-10-houyhnhnms-vs-martians/
Hoon is soooo weird. Obscurantism everywhere. For example: https://urbit.org/docs/tutorials/hoon/the-subject-and-its-legs/ – some languages are zero indexed (good), some are one indexed (not so good), but somehow Hoon is 2-indexed. Or Fibonacci indexed? I'm really unclear.
+>-:x is how you spell (caddr x).
+>-:x is how you spell (caddr x).
"^-(@ ud 15)" means "assert that 15 is an unsigned decimal and return it". Sure, right? ^- just screams "assert type"!
Note 15 has the AURA "unsigned decimal", not the type. Some auras NEST, they are not subtypes.
And how are some number decimal or binary?
Note 15 has the AURA "unsigned decimal", not the type. Some auras NEST, they are not subtypes.
And how are some number decimal or binary?
Hoon has no "strings", but it does have cords (UTF-8 strings), knots (ASCII), and tapes (another string?).
Check out https://urbit.org/docs/tutorials/hoon/caesar/ – to split a string call the gate (function) "trim" and to concatenate call "weld".
Sorry for the rubbernecking, I just can't help myself
Check out https://urbit.org/docs/tutorials/hoon/caesar/ – to split a string call the gate (function) "trim" and to concatenate call "weld".
Sorry for the rubbernecking, I just can't help myself