Motivated by the relentless quest for program performance and increasing demand for energy savings, program execution environment (e.g. computer architecture and operating systems) is becoming reconfigurable and adaptive. But programs are not: despite dramatically different inputs, machine configurations, and dynamically changing workload of operating systems, most programs always have the same code running with the same data structure. The mismatch incurred often causes program slowdown and resource under-utilization. The problem is exacerbated as chip multi-processors are becoming common place and most user programs are still sequential, increasingly composed from library code and running with interpreters and virtual machines. The ultimate goal of my research is an intelligent programming system, which injects into a program the ability to automatically adapt and evolve its code and data and configure its running environment such that a better version of the program could dynamically match its input, behavior and running environment.
Program adaptation is not possible without accurately forecasting a program's behavior. However, traditional modular program design and analysis are ill-fitted for finding large-scale composite patterns from increasingly complicated code, dynamically allocated data, and multi-layered execution environment (e.g. interpreters, virtual machines, operating systems and computer architecture.) My research views a program as a composition of large-scale behavior patterns, each of which may span a large number of loops and procedures statically and billions of instructions dynamically. I apply statistic technology to automatically recognize the patterns, build models of program behavior, and exploit them in offline program transformation (e.g. array regrouping based on locality and reference affinity research) and online program adaptation (e.g. behavior-oriented parallelization based on behavior phase research) to improve program performance and correctness.