Redeeming Distributed Application Development with Recompilers

Mainstream languages and tools are tailored for sequential, monolithic applications, with support for distributed computing provided only
in library APIs. Such programming environments force developers to make decisions about "where-code-runs" early in the application
lifecycle, structuring the entire application around partitioning decisions. Performance measurement may reveal that the original
partitioning was wrong, but redistributing the application is expensive because redistributing is restructuring. We have shipped tools that
can recompile executables into distributed form based on simple user annotations, inserting most of the necessary remoting and
synchronization boilerplate, and facilitating post-hoc instrumentation to drive quantitative redistribution. Since the tools operate on the
intermediate language CIL, they are compatible with a wide variety of .NET source languages and eventual execution environments, even those
that do not support .NET CIL directly, such as Javascript.