Concurrent and Distributed Functional SystemsEleni Spiliopoulou, Concurrent and Distributed Functional Systems. PhD thesis. Department of Computer Science, University of Bristol. September 1999. PDF, 975 Kbytes.
This thesis presents the Brisk Machine, a machine for executing functional languages, designed to be simple and flexible to support a number of run-time execution models for the Brisk compiler. Design considerations have been made to support dynamic loading, deterministic concurrency, distribution, debugging tools and logic programming. To achieve this, the compiler's intermediate language, the Brisk Kernel Language BKL is simpler than the STG language, as evaluation, extension and optimisation issues are relegated to special built-in functions. Moreover, function calls are saturated, as any function has an known arity and in every call to it, is applied to the right number of arguments, which makes the machine dynamic and supports dynamic loading. To incorporate deterministic concurrency in Brisk, we present the Brisk monadic framework. Its main innovation is to allow actions on state components. This is a key issue which enables state splitting, a technique which assigns to each new thread a part of the state, a substate, to act upon. Distinct concurrent threads are restricted to access disjoint substates. Thus, non-deterministic effects that arise when threads mutate the same state are avoided. To extend the expressiveness of deterministic concurrency, a deterministic form of communications has been introduced, where input from several threads is merged deterministically. The merging is based on hierarchical timestamping on messages from different sources and allows messages to be merged in a consistent temporal order. A model of distribution is presented, as incorporated in the Brisk run-time system, as a natural consequence of deterministic concurrency. The abstract model of this distributed system uses a uniform access memory model to provide a global memory view. This, combined with explicit thread based concurrency and explicit representation of demand enables the trustable distribution of reactive systems across different systems. Since referential transparency is preserved, any pattern of distribution has no effect on the semantics of the functional program. Computation, including both code and data, can be moved in response to demand.