Research in programming languages ranges from the practical side to the foundational sides. Our practical research helps programmers become more productive and efficient through approaches such as gradual typing and probabilistic programming. We are also working to build bridges between mainstream languages and cutting-edge approaches, such as logic programming, that will enable programming at a higher level. Our studies of the foundations of programming explore connections with other fields to discover how they are interrelated and attempt to identify patterns that can be useful in other disciplines, such as quantum physics.
Improving programming and applying it to other fields
Functional programming languages
Functional programming languages treat functions as first-class entities that circumscribe side effects. Functional programming eliminates side effects as the program state changes, making it easier to understand and predict the behavior of a program.
Support programming languages that enable programmers to choose which parts of a program undergo compile-time checking for errors and which parts undergo checking at run-time. Gradual typing enables the programmer to choose which “time” is appropriate for each piece of code, and it enables migration of code between run-time and compile-time checking.
Our research has two thrusts: revisiting the foundations of computing based on advances in quantum mechanics, and revisiting the foundations of quantum mechanics based on a computational resource-aware perspective. The main results include a new model of computation based on reversible deformations that naturally accounts for preservation of information, a precise accounting and analysis of some of the claimed speedups of quantum computing, and a resolution of an important debate on the relevance of the Kochen-Specker quantum-information theorem in a resource-bounded setting.
Parallelism and compiler optimizations
We harness the ubiquity of parallel hardware and its increasing heterogeneity to facilitate the advancement of programming languages that aid the parallel programmer by ensuring safety and by automating compiler decisions related to performance.