Intermediate Formats

The IF1 language [88] was defined as a target language for the Sisal compiler. IF1 is a hierarchical, single assignment language defining data flow graphs. An IF1 program consists of one or more acyclic graphs made up of simple and compound nodes, edges, and types. Nodes correspond to computations: simple nodes represent arithmetic operations and structure manipulation. Compound nodes represent structured expressions, using subgraphs for the components of conditionals and loops. Edges show the transmission of data between nodes; types are associated with the data transmitted on an edge. An IF1 program expresses data dependencies, with control left implicit; for example, an iteration is represented as a compound node with subgraphs describing generation of index values (for example, from an array), the body of the loop, and the computation of results. However, the control relationships between these components are left unspecified, can be interpreted as, for example, a data flow machine graph or a loop structure for a conventional multiprocessor.

IF2 [104] extends IF1 to include operations that explicitly allocate and deallocate memory, and nodes which place their results in specific memory locations. Artificial dependence edges can be used to specify synchronization constraints additional to those defined by the data dependencies expressed in the IF1 graph; these are particularly useful in defining optimizations which trade sequential threading of operations on a shared structure against parallel operations on copies of the structure. Further, edges can be annotated with pragmas which specify access rights to the data they transmit.

IF1 is functional, and hence expresses operations on values. IF2 is memory oriented, and particularly useful for transformations and optimizations of IF1 leading towards a low-level target program. By carefully designing IF2 equivalences for standard IF1 graph structures, the functional semantics of an IF1 graph (and hence of a functional source language such as Sisal) can be preserved and at the same time be implemented efficiently.

Regarding intermediate formats for Eiffel//, as much as possible, we will try to define and use common intermediate structures for both Sisal and Eiffel// manipulations. If not possible at the highest semantic level (IF1 for Sisal), it should at least be realistic when it comes to memory oriented representations with synchronization constraints (IF2). The idea of using common representation lies on the duality between the data dependencies coming from the data flow interpretation of Sisal, and the wait-by-necessity feature of Eiffel// which will also have to be represented with data dependencies.


                  



Project