  Recent trends like the Internet of Things (IoT) suggest a vision of dense and
multi-scale deployments of computing devices in nearly all kinds of
environments. A prominent engineering challenge revolves around programming the
collective adaptive behaviour of such computational ecosystems. This requires
abstractions able to capture concepts like ensembles (dynamic groups of
cooperating devices) and collective tasks (joint activities carried out by
ensembles). In this work, we consider collections of devices interacting with
neighbours and that execute in nearly-synchronised sense-compute-interact
rounds, where the computation is given by a single program mapping sensing
values and incoming messages to output and outcoming messages. To support
programming whole computational collectives, we propose the abstraction of a
distributed collective process, which can be used to define at once the
ensemble formation logic and its collective task. We formalise the abstraction
in the eXchange Calculus (XC), a core functional language based on neighbouring
values (maps from neighbours to values) where state and interaction is handled
through a single primitive, exchange, and provide a corresponding
implementation in the FCPP language. Then, we exercise distributed collective
processes using two case studies: multi-hop message propagation and distributed
monitoring of spatial properties. Finally, we discuss the features of the
abstraction and its suitability for different kinds of distributed computing
applications.
