java layers language support for stepwise refinement rich cardone, ibm research & ut at austin...
TRANSCRIPT
Java Layers
Language Support for Stepwise Refinement
Rich Cardone, IBM Research & UT at Austin
Calvin Lin, University of Texas at Austin
12/7/00 Java Layers/RC,CL 2
Problem
Software development and maintenance is expensive
Difficult
Takes a long time
Assemble applications from off-the-shelf components
Mix and match features to create applications
Plug and unplug components to change applications
12/7/00 Java Layers/RC,CL 3
Reuse is Key
Separation of concerns
One application feature per component
Flexible composition
4Java Layers/RC,CL12/7/00
Presentation Overview
Part I – Motivation Mixins Stepwise Refinement Drawbacks of Mixins
Part II – Java Layers Java Layers Overview Two Language Features
12/7/00 Java Layers/RC,CL 5
An OO Problem
Car Box House
Problem: Lockable code replicated 3 times
LockableCar
LockableBox
LockableHouse
lock(), unlock()
12/7/00 Java Layers/RC,CL 6
An OO Solution Use same lockable code for all 3 classes
Encapsulate lockable code in a class Subtype Car, Box, House with new class
Mixin Classclass Lockable<T> extends T {
lock(){…}
unlock(){…}
}[Bracha90]
12/7/00 Java Layers/RC,CL 7
Mixed-In Classes
Car Box House
Lockable<Car> Lockable<Box> Lockable<House>
Lockable code reused 3 times
<T>
Lockable<T>
12/7/00 Java Layers/RC,CL 8
Mixins
Types with parameterized supertypes
Depend on type parameters More precisely: Parametric Polymorphism
An OO mechanism for code reuse
Apply same code to unrelated classes
Work with single inheritance
12/7/00 Java Layers/RC,CL 9
Mixins & Software Components Question
Can we use mixins to build applications out of reusable components?
If so, then mixins must support: Separation of concerns Flexible composition
Let’s look at an example application
12/7/00 Java Layers/RC,CL 10
Example: Music Server Variation can occur on many axes:
Client interface{getSong, putSong, eraseCopyright, hideBritney, …}
Server execution strategy{single threaded, thread-spawning, thread pool, …}
Transport type Fault tolerance Server discovery …
12/7/00 Java Layers/RC,CL 11
Music Application Instances
Base
GetSong
PutSong
Simple
Base
GetSong
PutSong
NoBritney
HideBritney
Base
EraseCopyright
GetSong
Thief
ThreadSpawn
GetSong GetSong
GetSong
leaf-types
…
12/7/00 Java Layers/RC,CL 12
Application Assembly is Easy
class Simple extends PutSong<GetSong<Base>> {…}
class NoBritney extends HideBritney<PutSong<GetSong<Base>>> {…}
class Thief extends ThreadSpawn<GetSong<EraseCopyright<
Base>>> {…}
12/7/00 Java Layers/RC,CL 13
Base Class class Base {
}
static public class Server {
void dispatchLoop(){for(;;) dispatch(readRequest());}
void dispatch(Req req){errorUnknownReq(req);}
…
}
static public class Client {…}
12/7/00 Java Layers/RC,CL 14
GetSong Mixin
class GetSong<T extends Base> extends T {
static public class Client extends T.Client {
void getSong(…){…} }
static public class Server extends T.Server {
void dispatch(Req req){
if (req.name.equals(“getSong”)) processGetSong(req);
else super.dispatch(req);
}
…
}
}
constraint
nested mixins
12/7/00 Java Layers/RC,CL 15
Other Mixinsclass EraseCopyright<T extends Base> extends T {
static public class Client extends T.Client {
void eraseCopyright(…){…}
} …
}
class ThreadSpawn<T extends Base> extends T {
static public class Server extends T.Server {
void dispatchLoop(){…}
} …
}
12/7/00 Java Layers/RC,CL 16
Stepwise Program Refinement
Client Server
Base
EraseCopyright
GetSong
class Thief extends ThreadSpawn<GetSong<EraseCopyright<Base>>> {…}
ThreadSpawn
Layer
s
[Batory92]
12/7/00 Java Layers/RC,CL 17
Drawbacks of Mixins
Superclass initialization Runtime efficiency Leaf-type references Composition validation
Semantic validity Syntactic correctness
12/7/00 Java Layers/RC,CL 18
Recap Software components imply reuse Mixins reuse OO code Mixins build applications incrementally
Stepwise program refinement Nested types encapsulate features Feature mixing and matching
Mixins have usability & efficiency drawbacks
19Java Layers/RC,CL12/7/00
Part II – Java Layers
Java Layers Overview
Two JL Language Features
Status
Conclusion
12/7/00 Java Layers/RC,CL 20
Goal of Java Layers
Increase software reuse to reduce
development and maintenance costs
Use layered, stepwise program refinement
Encapsulate features in mixins classes
Compose features through type instantiation
12/7/00 Java Layers/RC,CL 21
JL’s Foundation
Java + Constrained Parametric Polymorphism
(CPP) There are several proposals for adding CPP to Java
[Agesen97, Bokowski98, Bracha98, Cartwright98, Myers97, Solorzano98]
JL is a heterogeneous implementation of CPP Conventional syntax and semantics
Parametric classes and interfaces
Mixins
12/7/00 Java Layers/RC,CL 22
The JL Language
JL is a parametric Java plus 4 features: Deep conformance Static virtual typing Semantic checking Constructor propagation
All language extensions are designed to support stepwise refinement
12/7/00 Java Layers/RC,CL 23
JL Compiler Support
Class hierarchy optimization
Remove design-time layering from runtime code
Inline calls to superclass methods w/same
signature
Collapse class hierarchy into a single class
12/7/00 Java Layers/RC,CL 24
The Need for Deep Conformance
JL adds support for deep type checking Supertypes are checked for required nested types
class Parent { class Inner {…} }
class Child extends Parent {…}
Question:
Does Child contain a nested class named Inner?
Answer: Maybe
Java supports shallow type checking
Interfaces and classes
12/7/00 Java Layers/RC,CL 25
Deep Conformance
Deep Conformance supports stepwise refinement
Enforces structural conformance at all nesting depths
Subtypes can safely refer to nested types in their supertypes
Feature composition is enhanced by added type precision
12/7/00 Java Layers/RC,CL 26
Deep Conformance Example
class HideBritney<T extends Base deeply> extends deeply T {
static public class Client extends T.Client {…}
static public class Server extends T.Server {…} }
HideBritney contains all the public nested types of T
Compiler generates missing nested types if necessary
Type parameter T binds to classes that: Extend Base Contain a nested Client class that extends Base.Client Contain a nested Server class that extends Base.Server
12/7/00 Java Layers/RC,CL 27
Deep Conformance Syntax
Deeply modifier for implements and extends
clauses
Different meaning in constraint and inheritance
clauses
Operates on public nested types by default
Propagate modifier for non-public nested
types
Enables selective deep type checking
Use in parameterized and non-parameterized
types
12/7/00 Java Layers/RC,CL 28
A Use of Virtual Types
class Node {Node next;}
class DoubleNode extends Node {DoubleNode prev;}
class Node {virtual Node; Node next;}
class DoubleNode extends Node {typedef Node as DoubleNode;
DoubleNode prev;}
[Thorup97]
In DoubleNode:
next is type Node
prev is type
DoubleNode
In DoubleNode:
next is type
DoubleNode
prev is type
DoubleNode
12/7/00 Java Layers/RC,CL 29
Virtual Types The automatic adaptation of types through
inheritance. Virtual types change through subtyping
A child class can change the type of its parent
Benefits of Virtual Typing Greater type precision
Better type checking
Less manual typecasting
Genericity (Beta)
12/7/00 Java Layers/RC,CL 30
JL’s This Virtual Type This pseudo-type is like the “type of this.” Static binding
Used in parametric types only Bound at instantiation time
Enhances JL’s expressiveness Allows the instantiated leaf-type to be
expressed within the mixins being composed to define that leaf-type.
12/7/00 Java Layers/RC,CL 31
This Example
Base
GetSong
Client-Factory
PutSong
class ClientFactory<T extends Base deeply> extends T deeply {
static public class Client extends T.Client
{ static Client clientFactory() {return new Client();} } … }
class ClientFactory<T extends Base deeply> extends T deeply {
static public class Client extends T.Client
{ static This clientFactory() {return new This();} } … }
leaf-type
12/7/00 Java Layers/RC,CL 32
Work Completed
Implemented JL prototype
Compared JL to OO
Frameworks
Reengineered Schmidt’s ACE
ICSE 2001 paper
12/7/00 Java Layers/RC,CL 33
Future Work
Develop new JL compiler
Implement language described here
Build a family of related applications
Compare JL and OO approaches
12/7/00 Java Layers/RC,CL 34
Related Work GenVoca – Batory92-00, Smaragdakis98-99
Parametric Polymorphism – Agesen97,
Bokowski98, Bracha90, Bracha98, Cartwright98, Myers97, Solorzano98
Virtual Types – Bruce97-98, Madsen89, Thorup97,
Thorup99, Torgerson98 Semantic Checking – Batory95, Perry89-93
Programming Paradigms – Danforth98, Gamma94,
Harrison93, Johnson91, Kiczales97, Schmidt98, Tarr99
12/7/00 Java Layers/RC,CL 35
Conclusion
JL extends Java to improve reusability
Promotes stepwise program refinement
Assembles applications from reusable parts
Builds on parametric polymorphism
Adds a small number of language features
Is this approach practical for application
programming?