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.