Computer systems today are ubiquitous and come in variety of forms. On the low end, there are resource-constrained battery-powered handheld devices that are widely used such as smart phones, tablets and netbooks. On the high end, there are powerful highly parallel multi-core devices such as desktops, workstations and servers. However, the diversity of these devices and the the heterogeneity of their platforms complicate software development. Developers must possess knowledge of a variety of architectures, platforms and languages in order to build, optimize, tune, and deploy software efficiently.
Despite their benefits, these remedies complicate understanding of software behavior and extracting performance. First, RC systems allow source code changes to be made in isolation with no regard to how different modifications interact to affect behavior and performance. Second, the ease of software deployment leads to different versions of the software being used by millions of users over diverse platforms making it difficult to reason about how the application will be used "in the wild". Third, MREs abstract the hardware, hinder performance understanding, and advanced MREs usually have high startup cost and footprint. They are also complex to build and maintain, particularly for Dynamic Scripting Languages (DSLs).
In this dissertation, we investigate the question of whether we can devise novel profile analysis and collection techniques to address the above drawbacks and enable better understanding and improve performance of managed languages. We answer this question by exploring novel solutions that exploit the use of modern collaboration technologies, open source managed runtime systems, and popular software distribution mechanisms. Our techniques include a performance-aware RC system for Java programs, interpreter-based optimizations and remote compilation framework for DSLs. We describe each of our techniques in detail and present empirical evidence of its efficacy and potential.