Fri Oct 18 08:27:18 EDT 2019

Practically, what does that substrate look like?

1. It has to be an event based language with abstract events and
   abstract state.  The program is (I,S) -> (O,S).

2. Blocking sequential program style will need to be implemented as a
   language preprocessing step.  ( Is this just async/await? )

3. Time has to be explicit.  Do not rely on a fixed clock.  If this is
   necessary, maybe add time stamps to the events instead.

The last one is an important constraint, because it is often implicit
in synchronous sytems where cycle counters can be used as part of the
state machine.  However, this trick cannot be used on a uC: all timers
need to be external inputs.