What is Ice?

Ice (Internet Communications Engine) is a distributed computing platform. It supports a variety of operating systems, compilers, and programming languages and allows you to create heterogeneous distributed applications. In other words, Ice allows you to easily create distributed applications that run on different operating systems and are written in different languages; Ice allows these applications to seamlessly interoperate.


A specification language called Slice allows you to define types and interfaces used by your applications, regardless of what languages you use to implement applications. A compiler then translates such language-independent specifications into a language-specific API. The generated API takes care of many of the communications chores that you would otherwise have to implement yourself. The diagram below shows the C++ tool chain of a typical Ice application:

Clients and Servers

As in other distributed systems, Ice applications are composed of clients and servers that cooperate on an overall task. The terms client and server are not firm designations for particular parts of an application; rather, they denote roles that are taken by parts of an application for the duration of a request:

  • Clients are active entities. They issue requests for service to servers.
  • Servers are passive entities. They provide services in response to client requests.

A pure server is one that only responds to requests but does not issue them. Similarly, a pure client issues requests but does not service them.

It is common for a program to act as both a client and a server. For example, a client might start a long-running operation on a server; as part of starting the operation, the client can provide a callback object to the server that is used by the server to notify the client when the operation is complete. In that case, the client acts as a client when it starts the operation, and as a server when it is notified that the operation is complete. Such role reversal is common in many systems, so, frequently, client–server systems could be more accurately described as peer-to-peer systems.

Objects and Proxies

An Ice object is an abstraction for an entity in the local or a remote address space that can respond to client requests. It has a unique identity and a main interface representing a collection of named operations that the object supports; the object may support additional interfaces as well. Clients issue requests by invoking operations on the object.

A proxy is a handle that a client uses to access an Ice object. You can think of a proxy as akin to a pointer in C++ or a reference in Java, except that a proxy can denote an object in a remote address space. When a client invokes an operation on a proxy, the Ice run time takes care of locating the object, starting its server if necessary, instantiating the object if necessary, and transmitting parameters between client and server.