Programming languages are more than a means for creating programs.

The languages we use shape the way we view the world, formulate questions, and ultimately solve problems. At their best, programming languages reveal the underlying patterns among seemingly different problems, they help us tease apart complexity and make the overwhelming manageable, and they support the sharing of ideas between people.

My research can be broadly organized into two categories:

  1. Design and application of domain-specific languages (DSLs).
  2. Foundational work on the principles and process of language design.

Naturally, work in each area complements and informs the other. For example, a useful research strategy is to explore language design issues through the design of individual DSLs. Grounding foundational work in the design of actual languages provides a pragmatic way to address rather open design questions and yields hopefully useful and interesting languages along the way.