Operating system primitives (e.g., problem-oriented shared memory, shared virtual memory, the Agora shared memory) and languages (e.g., Concurrent Prolog, Linda, Emerald) for programming distributed systems have been proposed that support the shared-variable paradigm without the presence of physical shared memory. The authors look at the reasons for this evolution, the resemblances and differences among these proposals, and the key issues in their design and implementation. It turns out that many implementations are based on replication of data. The authors take this idea one step further, and discuss how automatic replication (initiatied by the run-time system) can be used as a basis for a model, called the shared data-object model, whose semantics are similar to the shared variable model. Finally, they discuss the design of a language for distributed programming, Orca, which is based on the shared-data-object model.