Survey
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
Java Layers
Language Support for Layered
Refinement
Rich Cardone
Calvin Lin, Advisor
Department of Computer Sciences
University of Texas at Austin
January 16, 2001
In a Nutshell
Goal: Application assembly from reusable parts
Our Solution: Java Layers (JL)
Increase code reuse
Novel language features
Results: A practical way to construct applications
1/16/01
Simple
Effective
Evolutionary
Java Layers Proposal
2
Presentation Overview
Motivation
Background
Mixins
Java Layers
Methodology
Related Work
1/16/01
Java Layers Proposal
3
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
1/16/01
Java Layers Proposal
4
Reusable Components
Separation of concerns
One application feature per component
Flexible composition
1/16/01
Java Layers Proposal
5
Our Solution
Provide language support for reuse:
Software components
Encapsulate feature implementations
Stepwise Program Refinement
1/16/01
Build applications incrementally in layers
Java Layers Proposal
6
Contributions
1)
Feature identification
2)
Feature implementation
3)
Show how features can be integrated into an OO language
Language evaluation
4)
Identify essential features for domain-independent, stepwise refinement
Demonstrate advantages in building large applications
Domain-independence evaluation
Compare to domain-specific implementations of stepwise refinement
1/16/01
Java Layers Proposal
7
Background
Let’s look at a problem in object-oriented
programming.
1/16/01
Java Layers Proposal
8
An OO Problem
Car
Box
House
Lockable
Car
Lockable
Box
Lockable
House
lock(), unlock()
Problem: Lockable code replicated 3 times
1/16/01
Java Layers Proposal
9
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 Class
class Lockable<T> extends T {
lock(){…}
unlock(){…}
}
[Bracha90]
1/16/01
Java Layers Proposal
10
Mixed-In Classes
<T>
Car
Box
House
Lockable<T>
Lockable<Car>
Lockable<Box>
Lockable<House>
Lockable code reused 3 times
1/16/01
Java Layers Proposal
11
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
1/16/01
Java Layers Proposal
12
Example: Music Server
Variation can occur on many axes:
Client interface
{getSong, eraseCopyright, hideBritney, …}
Server execution strategy
{single threaded, thread-spawning, thread pool, …}
1/16/01
Transport type
Fault tolerance
Server discovery
…
Java Layers Proposal
13
Music Application Instances
Simple
NoBritney
Base
Base
Base
GetSong
GetSong
EraseCopyright
HideBritney
GetSong
leaf-types
Thief
…
ThreadSpawn
1/16/01
Java Layers Proposal
14
Application Assembly is Easy
class Simple extends
GetSong<Base> {…}
class NoBritney extends
HideBritney<GetSong<Base>> {…}
class Thief extends
ThreadSpawn<GetSong<EraseCopyright<
Base>>> {…}
1/16/01
Java Layers Proposal
15
Mixins as Reusable Components
VanHilst & Notkin, 1996
C++ mixins encapsulate changes to individual classes
Composed OO collaborations using multiple mixins
Built applications by combining multiple collaborations
Batory & Smaragdakis, 1998-present
Mixin Layers can encapsulate complete collaborations
Mixin Layers are mixins that contain nested mixins
Mixins can encapsulate all features in our example
1/16/01
Java Layers Proposal
16
Stepwise Program Refinement
class Thief extends
ThreadSpawn<GetSong<EraseCopyright<Base>>> {…}
Client
Server
Layers
Base
EraseCopyright
GetSong
ThreadSpawn
[Batory92]
1/16/01
Java Layers Proposal
17
The Good News
Mixins enhance OO code reuse
Each class encapsulates one feature
Mixins build applications incrementally
1/16/01
Add features one at a time
Java Layers Proposal
18
The Bad News
Mixins can have usability & efficiency drawbacks
That’s why Java Layers exists!
Implements mixins
Addresses mixin drawbacks
1/16/01
Java Layers Proposal
19
Java Layers Overview
Introduce JL’s technology base
Introduce 5 novel JL features
Describe mixin problem
Present JL solution
All JL features are designed to support stepwise
program refinement
1/16/01
Java Layers Proposal
20
JL’s Foundation
Java + Constrained Parametric Polymorphism (CPP)
There are several proposals for adding CPP to Java
[Agesen97, Bokowski98, Bracha98, Cartwright98, Myers97, Solorzano98]
JL’s implementation of CPP
Conventional syntax and semantics
Parametric classes and interfaces
Mixins
1/16/01
Java Layers Proposal
21
P1: Superclass Initialization
Superclass initialization is tricky with mixins
Class
Constructor
House
Car
Lockable<House>
House(Address)
Car(Make, Model)
?
Lockable<Car>
1/16/01
?
Java Layers Proposal
22
S1: Constructor Propagation
Automatic constructor generation
Generates constructors based on superclass
Adjusts constructor signatures
Contribution: Flexible mixin initialization
Mixin constructors generated at instantiation time
Superclasses get their initialization parameters
1/16/01
Java Layers Proposal
23
P2: Permissive Type Checking
interface I {
interface Inner {…}
}
class C implements I
{…}
Question:
Does C implement nested
interface Inner?
Answer: Maybe
Classes are not required to implement
nested interfaces
1/16/01
Java Layers Proposal
24
S2: Deep Conformance
Enhances Java’s type checking for nested types
Supertypes can be checked for required nested types
Classes implement interfaces at all nesting depths
Promotes mixin composition
Contribution: Client-centric semantics
Users of types decide on deep or shallow type checking
More flexible than producer-centric approaches
[Smaragdakis99]
1/16/01
Java Layers Proposal
25
P3: Referencing Leaf-Types
No way to express leaf-types within mixins
Runtime object’s precise type cannot be used
Possible in non-parameterized inheritance
1/16/01
Java Layers Proposal
26
S3: Static Virtual Typing
The automatic adaptation of types through inheritance
A virtual type in a parent class can change when subclassed
Specialized types automatically replace more general types
Mixins can express leaf-types in generated hierarchies
Contribution: Static binding of virtual types
No increase in dynamic type checking
No change in Java’s type system
Dynamic approaches are more expressive
[Bruce98, Thorup97]
1/16/01
Java Layers Proposal
27
P4: Composition Correctness
Syntactically correct mixin compositions can
yield semantically meaningless results
1/16/01
Mixins are too flexible!
Ex: HideBritney<HideBritney<Base>> ?
Java Layers Proposal
28
S4: Semantic Checking
Restrict inheritance with semantic constraints
Manually disallow syntactically correct but semantically invalid
mixin instantiations
Contribution: Use of pattern-matched constraints
Regular expression matching and a count operator
Familiar, simple, limited scope
Sufficient expressive power (so far)
[Batory96, Perry89]
1/16/01
Java Layers Proposal
29
P5: Performance
Increased load times
Deep class hierarchies of many small classes
Increased method calls
Feature code executes, then passes control on
Mixin method calls same method in superclass
Less efficient than conventional, unlayered code
1/16/01
Java Layers Proposal
30
S5: Class Hierarchy Optimization
Class hierarchy optimization
Inline calls to superclass methods w/same signature
Collapse class hierarchy into a single class
Contribution: Generate efficient mixin code
Remove design-time layering from runtime code
Extends existing compiler optimization techniques
1/16/01
Java Layers Proposal
31
Java Layers Anatomy
Java Layers =
Java + Constrained Parametric Polymorphism
+ Constructor Propagation
+ Deep Conformance
+ Static Virtual Typing
+ Semantic Checking
+ Class Hierarchy Optimization
1/16/01
Java Layers Proposal
32
Methodology
Design
Evaluate
Develop
Validate our analyses
Make implementations available to others
2 design-develop-evaluate cycles planned
1/16/01
Java Layers Proposal
33
Cycle 1 (completed)
Performed initial analysis
Implemented JL prototype
Compared JL to OO Frameworks
Reengineered Schmidt’s ACE
ICSE 2001 paper
1/16/01
Java Layers Proposal
34
ICSE Paper Results
JL advantages over frameworks:
Avoids overfeaturing
Avoids complex interfaces
Allows precise customization of applications
Promotes smaller, faster executables
Avoids the Framework Evolution problem
1/16/01
Java Layers Proposal
35
Cycle 2 (in progress)
Refined JL Language
Develop new JL compiler
Apply and evaluate refined language
Build a family of related applications
Compare to Domain-Specific Languages
1/16/01
Java Layers Proposal
36
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
1/16/01
Java Layers Proposal
37
JL and GenVoca
JL’s based on the GenVoca model
JL refines the GenVoca model
Specifies layer initialization
Integrates semantic checking
JL has novel language & compiler support
1/16/01
Java Layers Proposal
38
Summary
JL promotes an alternative programming methodology
Reduce development costs through reuse
Bring mixins into mainstream programming
Contributions: identification, integration and evaluation
Methodology: emphasize the practical
1/16/01
Java Layers Proposal
39
THE END
Think Layers
1/16/01
Java Layers Proposal
40
Base Class
class Base {
static public class Client {…}
static public class Server {
void dispatchLoop(){for(;;) dispatch(readRequest());}
void dispatch(Req req){errorUnknownReq(req);}
…
}
}
1/16/01
Java Layers Proposal
41
GetSong Mixin
constraint
nested mixins
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);
}
…
}
}
1/16/01
[Smaragdakis98]
Java Layers Proposal
42
Other Mixins
class 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(){…}
} …
}
1/16/01
Java Layers Proposal
43
The Need for Deep Conformance
Question:
class Parent {
class Inner {…}
}
Does Child contain a nested
class named Inner?
class Child
extends Parent {…}
Java supports shallow type checking
Answer: Maybe
Interfaces and classes
JL adds support for deep type checking
1/16/01
Supertypes are checked for required nested types
Java Layers Proposal
44
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
1/16/01
Java Layers Proposal
45
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 {…} }
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
HideBritney contains all the public nested types of T
1/16/01
Compiler generates missing nested types if necessary
Java Layers Proposal
46
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
1/16/01
Java Layers Proposal
47
A Use of Virtual Types
class Node {Node next;}
class Node
{virtual Node; Node next;}
class DoubleNode
extends Node
{DoubleNode prev;}
class DoubleNode extends Node
{typedef Node as DoubleNode;
DoubleNode prev;}
In DoubleNode:
In DoubleNode:
next is type Node
next is type DoubleNode
prev is type DoubleNode
prev is type DoubleNode
[Thorup97]
1/16/01
Java Layers Proposal
48
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)
1/16/01
Java Layers Proposal
49
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
1/16/01
Allows the instantiated leaf-type to be expressed
within the mixins being composed to define that
leaf-type.
Java Layers Proposal
50
Hypothesis
Stepwise program refinement can:
1) be supported by a small number of domain-
independent language features, and
2) provide an effective way to build large
applications
1/16/01
Java Layers Proposal
51
Flexible Class Hierarchies
Replaced class
Inserted class
Flexible
Rigid class
classhierarchy
hierarchy
1/16/01
Java Layers Proposal
52
Evaluation
Evaluate JL vs. standard OO development
Build a family of related applications
Compare flexibility, usability and reusability
Evaluate domain-independence
Compare to Domain-Specific Languages
Analyze tradeoffs of each approach
1/16/01
Java Layers Proposal
53
GenVoca Implementations
JL introduces no new type constructs
JL enhances mixin usability
JL is domain-independent
Average
Programming
Dude
GPL
Specialist
Assembled
Applications
Domain Expert /
Programmer
DSL
Bring stepwise refinement to mainstream programming
1/16/01
Java Layers Proposal
54