I have had many sources of inspiration in this area over the past three decades.
Without realizing it they started to coalesce in my head and seemingly unrelated ideas from very different areas started to come together to form what I eventually called 'flow' and I started to work on it.
The impetus to actually implement something, instead of just thinking about it, came when I was looking for some "serious", more complex, project in order to learn rust (and later adding WebAssembly to the mix).
It should be noted, that this project was undertaken in a very "personal" (i.e. idiosyncratic) way, without any formal background in the area of functional programming, data flow programming, communicating serial processes or similar. When starting it, I wanted to see if any of my intuitions and ideas could work, ignoring previous efforts or established knowledge and previous projects. I didn't want to get "sucked in" to just re-implementing someone else's ideas.
I have done quite a bit of reading of paper on these areas after getting a reasonable version of
and saw I was repeating a number of existing ideas and techniques..no surprise!
I have worked with these technologies listed below over the decares (from University until now) and they all added something to the idea for flow in my head.
- The Inmos transputer chip and its
Occam parallel programming
language (which I studied at University in the '80's), without realizing that this was based on Hoare's CSP.
- Parallel programming language (although not based on data dependencies)
- Parallel hardware 8and software processes) that communicated by sending messages over connections (some virtual in software, others over hardware between chips)
- Structured Analysis and Design from
my work with it in HP the '80s!
- Hierarchical functional decomposition
- Separation of Program from Context
- UNIX pipes
- Separate processes, each responsible for limited functionality, communicating in a pipeline via messages (text)
- Trace scheduling for compiler instruction scheduling based on data
dependencies between instructions (operations) work done at MultiFlow and
later HP by Josh Fisher, Paolo Faraboschi and others.
- Exploiting inherent parallelism by identifying data dependencies between operations
- Amoeba distributed OS by Andrew Tannenbaum that made a
collaborating network of computers appear as one to the user of a "Workstation"
- Distribution of tasks not requiring "IO", abstraction of what a machine is and how a computer program can run
- Yahoo! Pipes system for building "Web Mashups"
- Visual assembly of a complex program from simpler process by connecting them together with data flows