Mobility has become an important feature of computing systems
and networks, and particularly of distributed systems. Our project is
more specifically concerned with the notion of a mobile code, a
logical rather than physical notion of mobility. An important task in
this area has been to understand the various constructs that have been
proposed to support this style of programming, and to design a
corresponding programming model with a precise (that is, formal)
semantics.
The models that we have investigated in the past are mainly
the π-calculus of Milner and the Mobile Ambients calculus of
Cardelli and Gordon. The first one is similar to the
λ-calculus, which is recognized as a canonical model for
sequential and functional computations. The π-calculus is a model
for concurrent activity, and also, to some extent, a model of
mobility: π-calculus processes exchange names of communication
channels, thus allowing the communication topology to evolve
dynamically. The π-calculus contains, up to continuation passing
style transforms, the λ-calculus, and this fact establishes
its universal computing power. The Mobile Ambient model focusses on
the migration concept. It is based on a very general notion of a
domain -- an Ambient --, in which computations take place. Domains are
hierarchically organized, but the nesting of domains inside each other
evolves dynamically. Actually, the computational primitives consist in
moving domains inside or outside other domains, and in dissolving
domain boundaries. Although this model may look, from a computational
point of view, quite simple and limited, it has been shown to be
Turing complete. In the past we have studied type systems and
reasoning techniques for these models. We have, in particular, used
models derived from the π-calculus for the formalization and
verification of cryptographic protocols.
We have studied how to integrate the model of reactive
programming, described below, into a "global computing"
perspective. This model looks indeed appropriate for a global
computing context, since it provides a notion of time-out and
reaction, allowing a program to deal with the various kinds of
failures (delays, disconnections, etc.) that arise in a global
network. We have designed and implemented a core programming language
that integrates reactive programming and mobile code, in the context
of classical functional and imperative programming.
Security of concurrent and mobile programs
|
We are studying security issues, especially those related to
concurrent and mobile programming. In the past we have developed
methods and tools for the verification of cryptographic protocols. We
also work on secure information flow. This is motivated by the
observation that access control is not enough to ensure
confidentiality, since access control does not prevent authorized
users to disclose confidential information. We use the language-based
approach, developing static analyses, and especially type systems, to
ensure that programs do not implement illegal flow of information. We
work particularly on specific confidentiality issues arising with
concurrent and mobile programming, but we also work on more general
questions, like how to allow some pieces of code to declassify some
information, while still ensuring some confidentiality policy.
We also use static analysis techniques, namely polynomial
quasi-interpretations, to ensure that programs do not use
computational resources beyond fixed limits. Again, a special effort
is put here in finding methods that apply to reactive and/or mobile
programs. This could also have applications to embedded code.
Reactive and functional programming
|
Reactive programming deals with systems of concurrent processes
sharing a notion of time, or more precisely a notion of instant. At a
given instant, the components of a reactive system have a consistent
view of the events that have been, or have not been emitted at this
instant. Reactive programming, which evolves from synchronous
programming à la Esterel, provides means to react -- for
instance by launching or aborting some computation -- to the presence
or absence of events. This style of programming has a mathematical
semantics, which provides a guide-line for the implementation, and
allows one to clearly understand and reason about programs.
We have developed several implementations of reactive programming,
integrating it into various programming languages. The first instance
of these implementations was Reactive-C, which was the basis for
several developments (networks of reactive processes, reactive
objects), described in the book [Bou96]. Then we
developed SugarCubes, which allow one to program with a reactive
style in Java, see [Bou00]. Reactive programming
offers an alternative to standard thread programming, as
(partly) offered by Java, for instance. Classical thread
programming suffers from many drawbacks, which are largely due to a
complicated semantics, which is most often implementation-dependent.
We have designed, following the reactive approach, an alternative
style for thread programming, called FairThreads, which
relies on a cooperative semantics. Again, FairThreads have
been integrated in various languages, and most notably into
Scheme via the Bigloo compiler that we develop. One
of our major objectives is to integrate the reactive programming style
in functional languages, and more specifically Scheme, and to
further extend the resulting language to support migration
primitives. This is a natural choice, since functional languages have
a mathematical semantics, which is well suited to support formal
technical developments (static analysis, type systems, formal reasoning).