54 points mpweiher 1 day ago 11 comments
XCabbage 3 hours ago | parent
tgv 3 hours ago | parent
stefanha 39 minutes ago | parent
Garlef 2 hours ago | parent
Rock Paper Scissors but the graph presents the reveal as a reaction to the observation? In a loop? And somewhere there's a min-delay of a magical 1 sec? Why 1 sec and not 0.1 sec? Can this build up and the players get out of sync? (A bit strange to 'just wait, lol' if the language aims at solving problems in distributed systems).
Overall the example would be better if it separated the game from the players and also split out the repeat loop.
Maybe let both player reveal to a host and then receive a result (and the choices) ~ This way both players can be sure that the choice of the other player is independent of the observation.
(I know that the example is 'correct' in that the choice is made independent of the observation but I think the example could be improved if it solved some of the coordination problems involved in the scenario more cleanly through code architecture).
Overall I quite like the idea of having this polyglot meta language!
samuell 2 hours ago | parent
player2.reveal -> player1.observe
player1.reveal -> player2.observe
That is, enabling data flow connections between individual inputs/outputs, and not just between components, which otherwise is too limiting, and typically causes a lot of extra syntax to handle that routing otherwise.Wrote about it in the context of workflow systems way back (https://livingsystems.cc/posts/workflows-dataflow-not-task-d...)
---
Edit 11:12 CET: I realize that “named ports” better captures what I had in mind here, as elaborated in a comment below.
mpweiher 2 hours ago | parent
In addition, connectors also become structured.
Objective-Smalltalk uses polymorphic connectors to adaptively and mostly automatically choose the level of granularity you want to operate at.
https://dl.acm.org/doi/10.1145/3689492.3690052
---
That aside: really cool article! Dataflow just pops up everywhere as a really, really useful abstraction, and our languages don't support it well as a general mechanism.
Instead we tend to have specialized dataflow-y tooling for one area of programming where the advantages are so significant that the impedance mismatch is worth it nonetheless.
samuell 2 hours ago | parent
> Now what are "IN" and "OUT" that our pseudocode receives IPs from and sends them to? They are not the names of connections, as this would tie a component's code to one place in the network, but are things called "ports". "Portae" means "gates" in Latin, and ports (like seaports) can be thought of as specific places in a wall or boundary where things or people go in or out. Weinberg (1975) describes a port as
"... a special place on the boundary through which input and output flow... Only within the location of the port can the dangerous processes of input and output take place, and by so localizing these processes, special mechanisms may be brought to bear on the special problems of input and output."
https://www.jpaulmorrison.com/fbp/concepts_book.shtml
Still, I'm amazed at how it took so long before they became mainstream in data flow oriented libraries and DSLs.
And it seems J.P. Morrison was also highlighting Named ports as particularly useful, which is also perhaps what I should have highlighted in my initial comment above.
It's gotten better lately it seems, but a lot of tools skipped that part, which now requires tons of specialized syntax just for routing of multiple parallel streams.
---
Thank you for kind words!
arto 1 hour ago | parent
Haven880 46 minutes ago | parent
andvgal 33 minutes ago | parent
rramadass 14 minutes ago | parent
Your use of the word "Reactor" at first confused me since there is a "Reactor Pattern" for event handling (https://en.wikipedia.org/wiki/Reactor_pattern) which is not what you mean.
How does your concurrency model differ from that of Erlang (the poster child for distributed concurrency)? Do you have a paper detailing your model and comparing with other languages?
I recently read Roman Obermaisser's book "Event-Triggered and Time-Triggered Control Paradigms" which seems applicable to your architecture. At the bottom most level you have a global communication network based on a synchronized global clock and "Time-Triggered"(TT) semantics which is deterministic. A "Event-Triggered"(ET) communication channel is then built on top of it which is non-deterministic. That way the system provides both hard real-time (i.e. TT) and soft real-time (i.e. ET) semantics.