Unfortunately, building real-life distributed systems is not easy. It is hard, for instance, to implement instructions such as "send this data structure to be processed on that computer." To enable this, we have to worry about details of the different hardware architectures and operating systems involved, etc. The good news is that there are ways to abstract away some of the details of this process. RPC (Remote Procedure Call), for example, implements the idea of calling functions which will be executed in a remote machine. When a RPC function is called, what really happens is that the RPC library performs data marshalling on the function parameters and sends them to the remote computer; that computer, after having executed the function itself, marshalls and returns the results back to the caller. Nowadays, several distributed systems are being built using technologies derived from RPC; among these technologies are RMI(Java), CORBA and DCOM.