Reconciling Software Extensibility with Modular Program Reasoning
Monday, March 31, 2003
Host: Richard Cole, email@example.com, 212-998-3119
Languages can help programmers build robust software systems by supporting the creation of reusable components. However, current languages have severe restrictions that hinder the utility of such components. For example, a well-known problem in object-oriented languages is the inability for clients to easily add application-specific methods to existing classes. Languages like Cecil, AspectJ, and HyperJ resolve this problem (and several others), but they must forego modular reasoning, requiring some whole-program information in order to properly typecheck and compile even a single class.
In this talk I describe my thesis work, which addresses longstanding extensibility limitations of traditional components while maintaining modular typechecking and compilation. I formally studied the problems in the context of a simple and flexible core language and designed a range of possible solutions, at various points along the tradeoff between expressiveness and modular reasoning. This theoretical work then informed my design of practical extensions to mainstream languages. One of these, MultiJava, is a small, backward-compatible Java extension supporting (among other things) the ability to modularly add new methods to existing classes. MultiJava has been in daily use by others in a variety of application domains since March 2002. It has been particularly successful in supporting the implementation of reliable ubiquitous computing systems, where extensibility is at a premium. MultiJava allows the desired extensibility idioms to be declaratively expressed and statically checked, easing program maintenance and removing a large source of potential runtime errors.