We believe that writing computer programs is the fundamental act of computer science, and that programming languages are therefore our fundamental tool.

We seek a deeper understanding of programming languages and how it should be used, and we seek to apply this understanding to the program design process, as well as to novel applications.

We take a multi-faceted approach to the study of programming languages and programming methodology, incorporating elements of design, mathematics, experimental science, and engineering.

We conduct research on all aspects of programming, including:

  • the development of small and large programs
  • the design, implementation, and analysis of programming languages
  • programming environment tools

Programming languages are our interface to the machines that carry out computation on our behalf. Eighty years after the invention of the lambda calculus, thousands of different computer languages are in daily use.


Programming languages started out closely tracking the hardware on which they ran. Nowadays, they provide high-level abstractions designed to closely match the problem domains of their user base. Consider the following domains of application that have given rise to dedicated language technologies:


  • Web programming: much of the interactions while browsing the web today is programmed in JavaScript, a dedicated language designed to be wholly portable, have limited capabilities and allow for rapid development. But over the 20 years since its inception, it has become clear that JavaScript is not capable of supporting large projects – web sites are increasingly complex software systems.

  • Data analytics: analyzing complex data has been the bread and butter of the likes of S-Plus and later R as well as Matlab. These systems have distinctive characteristics that include, for example, support for vectorization and missing observations. However, thorough analysis of R has revealed a number of weaknesses in performance and scalability. New language such as Julia and Spark are starting to address those.

  • Secure programming: assurance against malicious code and against loss of secrecy or privacy are growing in importance as the societal cost of security breaches is becoming more severe. Security can be incorporated as an integral part of the language as in the Jif extension to Java, or the PI’s JSLocker extension to JavaScript. However, achieving secure programming through programming languages still remain a constant cat-and-mouse game between attackers and language designers.

  • Probabilistic programming: a foundational technology for machine learning requires linguistic abstractions that match the appropriate computational model (e.g. graphical models and Bayesian networks). Languages like Church provide built-in support for probabilistic programming while other projects extend languages like Excel.

❝A language that doesn’t affect the way you think about programming is not worth knowing. ❞

‒Alan Perlis