In recent years a number of π–calculus variants have been introduced in order to study some aspect of distributed and mobile processes. They include:
- The π1–calculus of Amadio [Ama00], for modelling distributed computations with mobil-ity of processes, failures and routing of messages;
- The distributed π–calculus Dπ of Hennessy and Riely [HR98], that extends the π–calculus with explicit locations and migrations;
- The Distributed Join Calculus of Fournet et al [FGL+96], intended as the basis for a mobile agent language;
- The Fusion Calculus of Parrow and Victor [PV98] and the Explicit Fusion Calculus of Gardner and Wischik [GW00], where communications are symmetric and channels can be fused.
1.2. RELATED WORKS 7 In particular, the explicit fusion calculus was used as a foundation for the Fusion Machine of Gardner, Laneve and Wischik [GLW02], a forerunner of the localized linear forwarder calculus.
Some programming languages based on the π–calculus, or on one of its variants, were also implemented. Some of them include:
- Pict of Pierce and Turner [PT00], a strongly–typed concurrent programming language without mobility of processes;
- Nomadic Pict of Sewell, Wojciechowski and Pierce; [WS00], which has mobile agents and explicit locations
- The Join Calculus Language [Joi02] and Jocaml [CF99] both based on the Join Calculus.
Chapter 2
Core Language and Compiler Theory
The aim of this chapter is to define the theoretical foundations of our work. We first describe the hipi core language and the bytecode. Then we define their semantics and the encoding from the former to the latter. Finally, we prove the correctness of the encoding.
The hipi core language is a variant of the synchronous π–calculus [MPW92] which includes mobility of processes (through an explicit migration term) and some simple data types (integers, strings and sorted channels). The bytecode is a variant of the localized linear forwarder calculus [GLW03] with explicit migrations and data types (integers, strings and unsorted channels). In the following we do not describe formally the type checker or the properties of the type system.
As a future work, we expect to replace this simple type system with XML data types as in XDuce [HP03].
2.1 Hipi Core Language Syntax
We now define the syntax of the hipi core language. We assume an infinite set of variable identifiers X ranged over by u, w, x, y, z, . . ., an infinite set of type identifiers ranged over by r, s, t, . . . and an infinite set of identifiers for recursive definitions R ranged over by D, E, . . ..
We use ex to denote the (possibly empty) sequence x1, . . . , xn. Sometimes we also use the same notation ex to denote the set {x1, . . . , xn}.
A program in the hipi core language is a triple (Φ,Γ,P ) where Φ is a mapping from type identifiers into type expressions, Γ is a mapping from recursive definition names into abstrac-tions and P is a process. Φ allows us to use type identifiers as types for variables declared inside a program and it allows recursive types. Γ is a function environment: it allows the definition of recursive definition calls (as in π–calculus). Finally, P is the “main” process executed at run–time.
Definition 2.1 (Process) Processes in the hipi core language are defined by the following grammar:
P ::= 0 nil
| x . send ( eE ) ; P channel output
| x . recv ( fT x ) ; P channel input
| let T x = E in P new constant
| new T x in P new channel
9
| if ( E ) { P } { P } if then else
| D ( eE ) ; P recdef call
| spawn [ @ x ] { P } P new process
Processes P include statements used for operations on channels, declaration of variables and control–flow commands. The term 0 represents the empty process and we usually omit it at the end of a sequence of statements. The send and the recv statements are the output and the input terms of the π–calculus with typed objects. The let defines a new immutable variable x assigning E to it (as a constant) and its scope is the following P . The statement new creates a new channel x and its scope is the following P . The if is as usual in programming languages.
The recursive definition call is as usual in π–calculus [Mil99] but includes a continuation P that is executed in parallel. Finally, the spawn statement can be used to execute two processes in parallel.
The optional argument @x of the spawn statement can be used for the explicit migration of a process. Explicit migration are optimizations for communications: if the spawned process (that is the process that executes the first occurrence of P in the statement) executes a lot of communications on the channel x then it could be convenient for it to migrate to the location of x: this migration is achieved with the @x option.
Abstractions are as in π–calculus [Mil99] with typed variables instead of channel names.
An abstraction A = ( fT x).P can be instanciated using a concretion term Aheyi. This concretion becomes P {ye/xe}.
Definition 2.2 (Types) Types of the language are the followings:
T ::= int integer type
| string string type
| channel < eT > channel type
| t type identifier
Types are only int, string and channel<...>. The type system is completed with type identifiers: using them it is possible to define recursive types.
Definition 2.3 (Expressions) Expressions and literal values are described by the following grammar:
E ::= x variable
| LiteralInt integer value
| LiteralString string value
| E + E | E − E sum and sub
| E ∗ E | E / E | E % E mul, div and mod
| E > E | E == E | E ! = E comparators
| E && E | ! E boolean operators
Expressions E can be used to specify arguments of invocations of recursive definitions, and also the entities sent on channels. They are evaluated during execution (i.e. in the operational semantics). A LiteralInt is an element of Z and a LiteralString represents a string. Operators on expressions are all standard: combining them it is possible to obtain also <,<=,>=, the unary minus and the boolean choice ||.
Definition 2.4 (Well–Formed Hipi Core Program) A well–formed program in the hipi core language satisfies the following requirements:
2.2. HIPI CORE LANGUAGE SEMANTICS 11