Modularly Typesafe Interface Dispatch in JPred - PowerPoint PPT Presentation

About This Presentation
Title:

Modularly Typesafe Interface Dispatch in JPred

Description:

JPred compiler. Eclipse. 8. Background: JPred. class Spy { void escape(Vehicle v) ... class Spy { void escape(Vehicle v) void escape(Vehicle v) when v_at_Flyable ... – PowerPoint PPT presentation

Number of Views:38
Avg rating:3.0/5.0
Slides: 22
Provided by: christophe76
Category:

less

Transcript and Presenter's Notes

Title: Modularly Typesafe Interface Dispatch in JPred


1
Modularly Typesafe Interface Dispatch in JPred
  • Christopher Frost and Todd Millstein
  • University of California, Los Angeles
  • frost,todd_at_cs.ucla.edu

2
Background Multimethod Dispatch
  • class Spy
  • void escape(Vehicle v)
  • void escape(Vehicle_at_Driveable v)
  • void escape(Vehicle_at_Flyable v)

Vehicle
Vehicle v ... spy.escape(v)
3
Background Multimethod Dispatch
  • class Spy
  • void escape(Vehicle v)
  • void escape(Vehicle_at_Driveable v)
  • void escape(Vehicle_at_Flyable v)

Vehicle
void escape(Vehicle v)
?
Flyable
Driveable
?
?
Submersible
void escape(Vehicle_at_Driveable v)
  • Multimethod lookup most specific method for
    runtime types of arguments
  • Possible message dispatch errors
  • Message-not-understood
  • Message-ambiguous

4
Background Multimethod Dispatch
  • class Spy
  • void escape(Vehicle v)
  • void escape(Vehicle_at_Driveable v)
  • void escape(Vehicle_at_Flyable v)

Vehicle
Flyable
Driveable
  • Typechecking ensure methods are exhaustive and
    unambiguous
  • Typechecking can be done modularly
  • Only use knowledge of modularly available types

5
Dispatch on Java Interfaces
class Spy void escape(Vehicle v) void
escape(Vehicle_at_Driveable v) void
escape(Vehicle_at_Flyable v)
Vehicle
Flyable
Driveable
?
Ultra
  • Let Vehicle, Driveable, and Flyable be interfaces
  • Method lookup can become ambiguous!
  • Modular typechecking must conservatively rule out
  • Must rule out multimethods with 2 interface
    dispatches
  • Underlying problem multiple inheritance

6
Prior Approaches
  • No typechecking
  • commonloops, clos, dylan, cmm
  • Require whole program analysis
  • cecil, tuple, doublecpp, nice
  • Forbid interfaces from being dispatched upon
  • multijava, jpred (originally)
  • Restrict multiple inheritance to only within a
    module
  • dubious, half half
  • Linearize multiple dispatch or inheritance
    semantics
  • polyglot, castagna

7
Our Contributions
  • Practical interface dispatch
  • Preserves modular typechecking
  • Key predicate dispatchs expressiveness Ernst
    et al 98
  • Instantiate in the context of JPred Millstein
    04
  • Formalize and prove type soundness
  • Demonstrate utility in practice through case
    studies
  • JPred compiler
  • Eclipse

8
Background JPred
  • Method predicate guards subsume multimethods
    expressiveness
  • Dispatch on class types, fields, linear
    arithmetic, binding, and , , and ! operations
  • m1() overrides m2() if m1()s predicate implies
    m2()s
  • class Spy
  • void escape(Vehicle v)
  • void escape(Vehicle v) when v_at_Driveable
  • void escape(Vehicle v) when v_at_Flyable

void escape(Vehicle v) when v_at_Driveable
inSwamp boolean inSwamp
9
Fixing Interface Dispatch Modularly
class Spy void escape(Vehicle v) void
escape(Vehicle v) when v_at_Driveable void
escape(Vehicle v) when v_at_Flyable
!v_at_Flyable
void escape(Vehicle v) when v_at_Driveable
v_at_Flyable
void escape(Vehicle v) when v_at_Driveable
v_at_Flyable
  • Insight Predicate dispatch allows modular
    resolution of all possible multiple inheritance
    ambiguities

Vehicle
  • Example resolution approaches
  • Add additional method(s) to cover all possible
    ambiguities

Flyable
Driveable
  • Change existing method(s) to cover all possible
    ambiguities

Ultra
10
Ordered Dispatch
class Spy void escape(Vehicle v) void
escape(Vehicle v) when v_at_Flyable void
escape(Vehicle v) when v_at_Driveable
!v_at_Flyable
Vehicle
Flyable
Driveable
P1
Submersible
Submersible
P2
!P1
void escape(Vehicle v) when v_at_Submersible
!v_at_Flyable !v_at_Driveable
P3
!P2
!P1
11
Ordered Dispatch
  • class Spy
  • void escape(Vehicle v)
  • when v_at_Flyable
  • when v_at_Driveable
  • when v_at_Submersible

Vehicle
Flyable
Driveable
Submersible
  • First-match lookup
  • Mirrors common instanceof coding styles
  • Purely syntactic sugar
  • Methods can use combinations
  • of ordered and non-ordered dispatch

12
Predicate Satisfiability
  • class Spy
  • void escape(Vehicle v)
  • when v_at_Flyable
  • when v_at_Driveable
  • when v_at_Ultra

Vehicle
Flyable
Driveable
Ultra
Desugars to
void escape(Vehicle v) when v_at_Ultra
!v_at_Flyable !v_at_Driveable
  • Ultras predicate is not satisfiable
  • Easy mistake with large interface hierarchies

13
Predicate Satisfiability
  • class Spy
  • void escape(Vehicle v)
  • when v_at_Flyable
  • when v_at_Driveable
  • when v_at_Ultra

Vehicle
Flyable
Driveable
Ultra
Typechecker unreachable!
  • Add static typecheck
  • Unsatisfiable predicates
  • Also useful for non-ordered dispatch

14
Implementation
  • JPred extension to the Polyglot Java compiler
  • Nystrom et al 03
  • Original JPred disallowed interface dispatch
  • JPred compiler changes
  • Allowed interface dispatch
  • Added ordered dispatch to the parser
  • Added predicate satisfiability check
  • Code generation unchanged

15
Featherweight JPred
  • Extension of Featherweight Java Igarashi et al
    01
  • Added interfaces and method predicates
  • Formalized syntax and dynamic and static
    semantics
  • Proved a type soundness theorem through progress
    and preservation
  • Validates sufficiency of modular typechecking
  • First provably sound formalization of predicate
    dispatch

16
Case Studies
  • JPred Compiler
  • Originally written in JPred using class dispatch
  • Eclipses Java Development Tooling UI Plugin
  • Originally written in Java

17
Case Studies JPred Compiler
  • Originally written as a Polyglot extension in
    JPred using class dispatch
  • Polyglot structure
  • Interface hierarchy representing AST nodes
  • Class hierarchy implementing the interfaces
  • Compiler passes using visitor design pattern
  • instanceof tests to provide specialized AST
    behavior
  • Polyglot intends for clients to interact only
    with interfaces
  • All AST class dispatches now interface dispatches
  • 28 updated messages 14 single, 14 two methods
  • Unsatisfiable predicate check caught bug in
    typechecker
  • 3 compile time increase

18
Case Studies Eclipse JDT UI
  • Goal Evaluate JPreds utility for complex
    programs not designed for predicate dispatch
  • Updated
  • ITreeContentProvider implementors getChildren()
    hasChildren()
  • Eclipses Java Development Tooling UI Plugin
    classes (org.eclipse.jdt.ui)

19
Case Studies Eclipse JDT UI
Eclipse method snippet
  • public Object getChildren(Object parentElement)
  • ...
  • if (parentElement instanceof IJavaModel)
  • return concatenate(
  • super.getChildren(parentElement),
  • getNonJavaProjects((IJavaModel)parentElement))
  • if (parentElement instanceof IProject)
  • return ((IProject)parentElement).members()
  • return super.getChildren(parentElement)
  • ...

20
Case Studies Eclipse JDT UI
  • Reduced type casts (all on interfaces) from 30 to
    3
  • Errors found by the compiler
  • 1 error repeated instanceof tests, second test
    unreachable
  • 1 possible error series of instanceof tests
    missing else clause, not exhaustive
  • JPred limitations
  • Dispatches occur only at top level
  • But Eclipse often does applicability tests within
    try/catch
  • Method calls are not allowed within predicates
  • JPred style targeted at logically independent
    cases
  • But Eclipse has instances of fall-through logic

21
Conclusions
  • Demonstrated a practical resolution to the
    tension between multiple dispatch and multiple
    inheritance
  • While retaining fully modular static typechecking
  • Key idea predicate dispatchs expressiveness
    allows programmers to modularly resolve multiple
    inheritance ambiguities
  • Validated our approach
  • Formalized and proved type soundness
  • Demonstrated utility through two case studies

22
Featherweight JPred Details
  • Method invocation rule
  • unew D() and mbody(m,C,D)(x, t0)
  • implies
  • (new C(v)).m(u) ? x -gt u, this -gt new C(v)
    t0
  • The interesting part of the progress proof
  • Showing method lookup always succeeds on
    well-typed programs -- prove sufficiency of the
    exhaustiveness and unambiguity typechecking
  • Progress If tT, then either
  • t is a value
  • t contains a subexpression of the form (S)(new
    C(v)) where TT Clt/S
  • there exists some term s such that t?s
  • Type Preservation If G tT and t?s, then
  • there exists some type S such that G sS and
    TT SltT

23
Case Studies Eclipse JDT UI
Eclipse method
  • public Object getChildren(Object parentElement)
  • try
  • if (parentElement instanceof IJavaModel)
  • return concatenate(
  • super.getChildren(parentElement),
  • getNonJavaProjects((IJavaModel)parentElement))
  • if (parentElement instanceof IProject)
  • return ((IProject)parentElement).members()
  • return super.getChildren(parentElement)
  • catch (CoreException e)
  • return NO_CHILDREN

24
Case Studies Eclipse JDT UI
Interface dispatch version of sample eclipse
method
  • public Object getChildren(Object parentElement)
  • try
  • return getChildrenHelper(parentElement)
  • catch (CoreException e)
  • return NO_CHILDREN
  • protected Object getChildrenHelper(Object
    parentElement) throws CoreException
  • when parentElement_at_IJavaModel
  • return concatenate(super.getChildren(parentEleme
    nt),
  • getNonJavaProjects(parentElem
    ent))
  • when parentElement_at_IProject
  • return parentElement.members()
  • return super.getChildren(parentElement)
Write a Comment
User Comments (0)
About PowerShow.com