\indent Using Java for high-performance distributed computing aggravates a
well-known problem: the choice between efficient message passing
environments and more convenient Distributed Shared Memory systems
which often provide additional functionalities like adaptive
parallelism or fault tolerance---with the latter being imperative for
Web-based computing.


This paper proposes an extension to the DSM-based \emph{Charlotte}
system that incorporates advantages from both approaches.  Annotations
are used to describe the data dependencies of parallel routines. With
this information, the runtime system can improve the communication
efficiency while still guaranteeing the correctness of the shared
memory semantics. If the correctness of these annotations can be
relied upon, additional optimizations are possible, ultimately sharing
primitive data types such as {\tt int} across a network, making the
overhead associated with accessing and sharing objects unnecessary. In
this case, the annotations can be regarded as a compact representation
of message passing semantics.  Thus, a program's efficiency can be
improved by a a step-by-step incorporation of semantic knowledge. The
possibility to freely mix and to easily switch between unannotated
code, annotated code and shared primitive data types entails a big
flexibility for the programmer.

A number of measurements show significant performance improvements for
annotations and annotation-based shared primitive types. 

