Slideshare.net (beta)

 
Post: 
Myspace Hi5 Friendster Xanga LiveJournal Facebook Blogger Tagged Typepad Freewebs BlackPlanet gigya icons

All comments

Add a comment on Slide 1

If you have a SlideShare account, login to comment; else you can comment as a guest


Showing 1-50 of 0 (more)

Neal Gafter Java Evolution

From deimos, 5 months ago

344 views  |  0 comments  |  0 favorites  |  0 downloads
 
 
 

Groups / Events

 

 
Embed
options

More Info

This slideshow is Public
Total Views: 344
on Slideshare: 344
from embeds: 0

Slideshow transcript

Slide 1: Evolving the Java Programming Language Neal Gafter

Slide 2: Overview The Challenge of Evolving a Language Design Principles Design Goals JDK7 and JDK8

Slide 3: Challenge: Evolving a Language “What is it like trying to extend a mature lan- guage?” -Brian Goetz

Slide 4: Challenge: Evolving a Language “What is it like trying to extend a mature lan- guage?” ma-ture: adjective 1. having completed natural growth and de- velopment. 2. completed, perfected, or elaborated in full. 3. (of an industry, technology, market, etc.) no longer developing or expanding.

Slide 5: Challenge: Evolving a Language Q: What is it like trying to extend a mature language? A: It is impossible, by definition.

Slide 6: Challenge: Evolving a Language Q: What is it like trying to extend a widely de- ployed language? A: Language change is influenced by existing code and APIs.

Slide 7: Existing APIs affect change Support retrofitting existing APIs: With compatible behavior

Slide 8: Existing APIs affect change Support retrofitting existing APIs: With compatible behavior Consistent with existing design Don't expose, create design flaws

Slide 9: Existing APIs affect change Some case studies: Generics (vs erasure) Wildcards (vs declaration-site variance) Autoboxing, unboxing (vs wrappers) Varargs (vs overloading) For-each (vs Iterator)

Slide 10: Generics (vs erasure) Adding reified generics is compatible May not allow retrofitting existing code Collection WeakReference

Slide 11: Wildcards (vs declaration-site variance) There is a simpler alternative to wildcards: declaration-site variance 'wildcards' appear on type definitions Use sites much simpler Can retrofit most APIs but not Collection

Slide 12: Autoboxing, unboxing Type systems form a lattice Object / Number Runnable | / Integer / / null

Slide 13: Autoboxing, unboxing Adding conversions can break the lattice long <----------> Long | | | | int <----------> Integer Existing boxed types don't have this relation.

Slide 14: Autoboxing, unboxing Solutions Introduce new boxing interfaces; or Patchwork specification

Slide 15: for-each (vs iterator) Iterator has a vestigal remove method. Introduce java.lang.Iterator without it? Cannot retrofit Collection without requiring recompile (existing implementations don't implement iterator() that returns the new type)

Slide 16: Design Principles

Slide 17: Design Principles Encourage desirable practices (that might not otherwise be followed) my making them easy synchronized Annotations isolate configuration data Generics for typesafe APIs

Slide 18: Design Principles Encourage desirable practices Isolate language from specific APIs

Slide 19: Design Principles Encourage desirable practices Isolate language from specific APIs Prefer reading over writing clarity over conciseness

Slide 20: Design Principles Encourage desirable practices Isolate language from specific APIs Prefer reading over writing Prefer static typing

Slide 21: Design Principles Encourage desirable practices Isolate language from specific APIs Prefer reading over writing Prefer static typing Remain backward compatible

Slide 22: Short-term design Goals Regularize Existing Language Improve diagnostics vs generics Fix type inference String switch Limited operator overloading Improved catch clauses Modularity

Slide 23: Improve Diagnostics vs Generics interface Box<T> { T get(); void put(T t); } class Tmp { static void test(Box<? extends Number> box) { box.put(box.get()); } } Error: put(capture#417 of ? extends java.lang.Number) in Box<capture#417 of ? extends java.lang.Number> cannot be applied to (java.lang.Number) box.put(box.get()); ^

Slide 24: Improve Diagnostics vs Generics interface Box<T> { T get(); void put(T t); } class Tmp { static void test(Box<? extends Number> box) { box.put(box.get()); } } Error: cannot call put(T) as a member of in Box<? ex- tends java.lang.Number> box.put(box.get()); ^

Slide 25: Fix Type Inference: constructors Today: Map<String, List<String>> anagrams = new HashMap<String, List<String>>();

Slide 26: Fix Type Inference: constructors Proposed: Map<String, List<String>> anagrams = new HashMap<>();

Slide 27: Fix Type Inference: arguments Today: public <E> Set<E> emptySet() { … } void timeWaitsFor(Set<Man> people) { … } // * Won't compile! timeWaitsFor(Collections.emptySet());

Slide 28: Fix Type Inference: arguments Today: public <E> Set<E> emptySet() { … } void timeWaitsFor(Set<Man> people) { … } // OK timeWaitsFor(Collections.<Man>emptySet());

Slide 29: Fix Type Inference: arguments Proposed: public <E> Set<E> emptySet() { … } void timeWaitsFor(Set<Man> people) { … } // OK timeWaitsFor(Collections.emptySet());

Slide 30: String Switch Today static boolean booleanFromString(String s) { if (s.equals("true")) { return true; } else if (s.equals("false")) { return false; } else { throw new IllegalArgumentException(s); } }

Slide 31: String Switch Proposed static boolean booleanFromString(String s) { switch(s) { case "true": return true; case "false": return false; default: throw new IllegalArgumentException(s); } }

Slide 32: Limited Operator Overloading Today enum Size { SMALL, MEDIUM, LARGE } if (mySize.compareTo(yourSize) >= 0) System.out.println(“You can wear my pants.”);

Slide 33: Limited Operator Overloading Proposed enum Size { SMALL, MEDIUM, LARGE } if (mySize > yourSize) System.out.println(“You can wear my pants.”);

Slide 34: Improved Catch Clauses: multi Today: try { return klass.newInstance(); } catch (InstantiationException e) { throw new AssertionError(e); } catch (IllegalAccessException e) { throw new AssertionError(e); }

Slide 35: Improved Catch Clauses: multi Proposed: try { return klass.newInstance(); } catch (InstantiationException | IllegalAccessException e) { throw new AssertionError(e); }

Slide 36: Improved Catch Clauses: rethrow Today: try { doable.doit(); // Throws several types } catch (Throwable ex) { logger.log(ex); throw ex; // Error: Throwable not declared }

Slide 37: Improved Catch Clauses: rethrow Proposed: try { doable.doit(); // Throws several types } catch (final Throwable ex) { logger.log(ex); throw ex; // OK: Throws the same several types }

Slide 38: Others? Properties? Serialization annotations?

Slide 39: Long-term goals Regularize Existing Language Reification Further Generics simplification Concurrency support Immutable data Control Abstraction Closures Actors, etc.

Slide 40: JDK7 jsrs 277 + 294 (modularity) Maintenance review of jsr14 “Small” language issues Possibly jsr308 (limited by time, resources)

Slide 41: JDK8 Reification Control Abstraction Further out: Immutable data, pattern match- ing, further operator overloading?

Slide 42: Q&A