Thank you! To install, `sudo` is not even required, so I'll change the default script.
I understand that designing any kind of distributed consensus is somewhat disputable (if not pretentious), but I'm not convinced that client-side decisions are enough.
For example, local reputation would not prevent posts from new users to be linked in the dependency graphs forever.
Client rules can still override the network for posts that are not blocked.
In fact, this reputation system is more about preventing abuse from new users and in some cases mistakes or hacked accounts from old users.
I think there's still space for experimentation on global consensus besides PoS (S=something).
In this particular system, reputation/consensus is local (per-topic) and depends on its own resources (posts) as well.
Only posts can farm reputation, the number of authors doesn't matter.
To farm reputation from posts, you would need an automated post creation algorithm that passes the Turing test (or an algorithm that creates useful content for the community, which would be legitimate).
Ultimately, authors that already have reputation decide which posts receive reputation.
I believe that would be difficult for a small number of malicious authors to take control of the community trying to be smart, but I don't have any strong evidence though.
Some colleagues are working on an operational semantics of the language (based on the one in the thesis).
This will allow us to prove some claims (e.g., reaction termination, bounded memory).
Then, we may think about something else.
Anything more specific in mind?
Yes, the problem on how to handle events in soft real-time applications with concurrent activities that affect each other.
We initially targeted constrained embedded systems and came with the following design decisions:
- Safe and seamless integration with C (everything in ES uses C). Approach: source-to-source compiler + finalization mechanisms.
- Allow shared memory concurrency (typical in ES with I/O ports and low-level manipulation). Approach: synchronous concurrency + full determinism.
- Small overhead (we target 8-bit micro-controllers). Approach: single-threaded implementation, lexical memory management (no GC).
After investigating the synchronous languages from the '80s (Esterel, Lustre, Signal), we came to the conclusion that we wanted something in the line of Esterel.
The thesis and papers [1] discuss the design decisions in extent.
I wrote in Lua the source-to-source compiler that takes a ".ceu" and generates a ".c" (the code is a single-threaded state machine), which is then compiled with gcc.
The compiler is slow, but not the final binary.
We wrote a paper [1] that compares flash,RAM,CPU usage from Céu vs hand-written event-driven code in C.
The differences are negligible.
1. Dynamic abstractions with lexical scope (vs. mostly static language). You can dynamically spawn code into a lexically-scoped pool.
2. Internal/fine-grained determinism (vs. external determinism). All statements execute in a deterministic order. E.g., if you have two printf's in parallel awaking from the same event, they will execute in lexical order.
3. Safe integration with C. When calling a C function that returns a pointer (e.g., "malloc"), Céu forces you to write a finalization clause (in which you can call "free"). If this code is somehow aborted, the "free" is called automatically.
4. Timers as first-class events (e.g., "await 1s"). Besides the convenience, Céu adjusts timers in sequence, e.g., if a first timer awakes a little bit late (due to system overhead), the timer in sequence will compensate.
5. Internal events are stack-based (vs. queue based). This allows co-routine-like functionality, resumable exceptions, and some other mechanisms.
6. Event-based logical notion of time (vs. tick based). A single event can occur at a logical time (related to #2).
[EDIT] Didn't mention that these are "advantages" depending on the context. Esterel targets hardware synthesis and also hard real-time systems. Dynamic abstractions might be irrelevant, fine-grained/sequential determinism in hardware might be inefficient, a tick is closer to a hardware clock, etc...
In comparison to Lustre:
Very different programming mindset.
IIRC, in Lustre you define equations and the system is responsible for keeping them up-to-date/correct.
It is a data-flow language (vs control-flow), closer to FRP than Céu/Esterel.
Synchronous: reactions run to completion, i.e., there's no implicit preemption or real parallelism (this avoids explicit synchronization: locks, queues, etc)
Structured: programs use structured control mechanisms, such as "await" (to suspend a line of execution), and "par" (to combine multiple awaiting lines of execution)
Structured programming avoids deep nesting of callbacks letting you write programs in direct/sequential style. In addition, when a line of execution is aborted, all allocated resources are safely released.
In comparison to FRP/dataflow, it is more imperative supporting sequences/loops/conditionals/parallels. The notion of (multiple) program counter is explicit. Also, everything is lexically scoped, there's no GC involved.
In comparison to promises/futures, it provides lexical parallel constructs, allowing the branches to share local variables and, more importantly, supporting safe abortion of code (with the "par/or").
Thank you!
I'm enthusiastic with the Arduino binding, it provides a friendly way to handle
events without much bloat.
These characteristics fit well in this domain of non specialists programming
constrained embedded systems.