We present the programming language KERIS, an extension of Java with explicit support for software evolution. KERIS introduces extensible modules as the basic building blocks for software. Modules are composed hierarchically, explicitly revealing the architecture of systems. A distinct feature of the module design is that modules do not get linked manually. Instead, the wiring of modules gets inferred. The module assembly and refinement mechanism of KERIS is not restricted to the unanticipated extensibility of atomic modules. It also allows extensions of already linked systems by replacing selected submodules with compatible versions without needing to re-link the full system. Extensibility is type-safe and noninvasive, i.e., the extension of a module preserves the original version and does not require access to source code.Modules, as architectural building blocks, are subject to continuous change. We consider this lack of support for unanticipated extensibility to be a serious shortcoming. In practice, one is required to use ad-hoc techniques to introduce changes in modules. In most cases this comes down to hacking the changes into the source code of the corresponding modules. This obviously contradicts the idea of deploying compiled module binaries. However, even for cases where the source code is available, invasive changes such as source code modifications are considered error-prone. With modifications on the source code level one risks invalidating the use of modules in contexts where they get already successfully deployed.The design of the programming language KERIS includes primitives for creating and linking modules as well as mechanisms for extending modules or even fully linked programs statically. KERIS' type system ensures that the definition, assembly and evolution of modules is safe. Programs written in KERIS are closed in the sense that they can be executed, but they are open for extensions that statically add, refine or replace modules or whole subsystems of interconnected modules. Extensibility does not have to be planned ahead and does not require modifications of existing source code, promoting a smooth software evolution process.In this paper we introduce KERIS as an extension of the programming language Java. In Section 2 we substantiate the need for linguistic abstractions in object-oriented programming languages for programming in the large and for evolving systems safely in the large. In Section 3 we present the design of the programming language KERIS by a stepwise introduction of KERIS' extensible module abstractions. The examples presented in Section 4 explain how extensible modules support family polymorphism. Section 5 gives an informal overview over the type-system. Our prototypical implementation of the KERIS compiler gets briefly reviewed in Section 6, followed by a discussion of related work in Section 7. Section 8 concludes.
MOTIVATIONLike many popular object-oriented languages, Java does not provide suitable abstractions for programming in the large [4]. In this section we argu...