ABSTRACT

The basic goal of this text is to introduce readers to the motivation and definition of language level constructs for concurrency that have been designed, studied, and found their way into languages that we can use today. What does this mean? In familiar languages, users employ high-level constructs constantly. Loops are a common example, and are used by defining blocks of code with corresponding control flow constraints. Programmers are not responsible for coding up the sequence of tests and jumps that actually implement the loop. They use the high-level construct for a while-loop or for-loop, leaving the details of implementing and managing the underlying control flow to the compiler. Similar high-level constructs exist to support operations such as switch statements and recursive procedure calls. Languages also provide abstractions of types and structures to allow programmers to work with complex data at a higher level of abstraction than the raw bytes in memory or on disk. The compiler assists with managing the actual layout in the computer and provides various checks to ensure that operations on the data conform to behaviors defined by the language standard (such as properly converting representations when mixing floating point and integer

arithmetic). It is a logical extension then that similar high-level constructs should be

available for expressing types and structures that are important within concurrent programs. If one wants to execute a loop whose body is executed by multiple processes in parallel, a construct at the abstraction level of the forloop should exist that states what should be executed in an iterative fashion while leaving the distribution of the work over multiple processors to a compiler or runtime system to decide. The abstraction is provided to separate the specification of what is to be done from how it is to be performed, providing sufficient information to the compiler in order to ensure that the resulting executable code conforms to the requirements of the programmer, such as the order and dependencies of operations. Similarly, data types should be available to represent data abstractions that the programmer works with at a high level, decoupled from the details pertaining to how the actual data is distributed amongst the processing elements of the parallel system.