\section{Introduction}

Object-oriented methodology has become an important approach to
improving the quality of software and increasing the efficiency
of its development. However, the evolution of distributed systems
in the practice of software engineering has introduced chaos
into object-oriented methods:  When a typical object-oriented
programming language is extended to support distributed applications,
the semantic concepts based on abstract data types that have been
useful for characterizing object models in sequential computation
lose their validity, and reliance is palced on {\em ad hoc}
operational models that fail to meet requirements of encapsulation
for the support of modular software construction. In particular,
the acknowledged difficulties of programming using traditional
primitives for coordinated multiprocessing reappear in most
object-oriented languages that support concurrency.

Our objective in this paper is to show how the benefits of
object-oriented methodologies can be realized in distributed
computing within the framework of functional programming, achieving
a more powerful form of modular program structure and avoiding
introduction of the possibility of nondeterminate program
behavior except when demanded by an application.

The presentation starts with some background observations regarding
object-oriented methodology and problems in practicing object-oriented
software engineering for a distributed or shared-memory
multiprocessing computing environment. We take
the {\em object modeling technique} (OMT) of Rumbaugh and his
colleagues~\cite{RumbaughEtAl91} as the point of departure for this discussion.
In Section~\ref{principles} we introduce {\em ObjectSisal},
a simple extension of the Sisal 2 functional programming
language~\cite{OldehoeftBohCanFeo92} to incorporate a
{\em class} construct that supports
user-defined immutable types, and we illustrate how
concepts of object and inheritance are supported.
We show how state machines can be implemented as stream-processing
functions using the stream data types of Sisal, yielding
functional, history-sensitive program modules.
The requirement to support nondeterminate
computation, in many real-time applications, for example, is met by
introducing the {\em nondeterminate merge} operation~\cite{Dennis77}
for data streams.

These ideas are illustrated by means of examples taken from real-world
applications for which object-oriented methods are attractive:
a logic simulation example in Section 4, and a telephone switching
system in Section 5. In Section 6, we compare ObjectSisal with
related programming languages and systems. We conclude in
Section 7 with a summary and some remarks regarding the implementation
of ObjectSisal.

