29
1 | © 2011 Oracle Corporation

© 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

Embed Size (px)

Citation preview

Page 1: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

1 | © 2011 Oracle Corporation

Page 2: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

2 | © 2011 Oracle Corporation

LOGO

Presenting with

Making heads and tails of Project Coin,

Small language changes in JDK 7

Joseph D. Darcy

Page 3: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

3 | © 2011 Oracle Corporation

“Project Coin is a suite of

language and library changes

to make things programmers do

everyday easier.”

Page 4: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

4 | © 2011 Oracle Corporation

coin, n. A piece of small changecoin, v. To create new language

Page 5: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

5 | © 2011 Oracle Corporation

Project Coin ready to use today!

• Remove extra text to make programs more readable

• Encourage writing programs that are more reliable

• Integrate well with past and future changes

Page 6: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

6 | © 2011 Oracle Corporation

Coin Constraints

• Small language changes

– Specification

– Implementation

– Testing

• Coordinate with larger language changes,

past and future, such as Project Lambda

• Complex language interactions; need to be wary in

– Specification

– Implementation

Page 7: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

7 | © 2011 Oracle Corporation

Coin Details

• Easier to use generics

– Diamond

– Varargs warnings

• More concise error handling

– Multi-catch

– try-with-resources

• Consistency and clarity

– Strings in switch

– Literal improvements

Page 8: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

8 | © 2011 Oracle Corporation

Project Coin History

• Project Coin in OpenJDK:

http://openjdk.java.net/projects/coin/

• Initial call for proposals to the community

• Implementation done as part of overall JDK 7 project

Specification and implementation

Page 9: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

9 | © 2011 Oracle Corporation

Project Coin Proposals

0

10

20

30

40

50

60

70

0

2

4

6

8

10

To

tal S

ub

mitte

d P

rop

osa

ls

Su

bm

itte

d P

rop

osa

ls P

er

Da

y

Days after Opening

Page 10: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

10 | © 2011 Oracle Corporation

coin-dev traffic

1

4

16

64

256

1024

4096

Monthly Messages

Total

Note:

Log scale

3300!

Page 11: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

11 | © 2011 Oracle Corporation

Project Coin Specification

• Specification in the JCP:JSR 334: “Small Enhancements to the

Java™ Programming Language”

http://www.jcp.org/en/jsr/detail?id=334

• Stages

– Early draft review

– Public Review

– Proposed Final Draft

– Final approval ballot underway!

Page 12: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

12 | © 2011 Oracle Corporation

IDE Support

• Beta support in Eclipsehttp://thecoderlounge.blogspot.com/2011/06/java-7-support-in-eclipse-jdt-beta.html

• IntelliJ IDEA 10.5

• NetBeans 7.0

http://netbeans.org/kb/docs/java/javase-jdk7.html

Here today and more on the way!

DEMO

Page 13: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

13 | © 2011 Oracle Corporation

Project Coin Features

• Binary literals and underscores in literals

• Strings in switch

• Diamond

• Multi-catch and more precise rethrow

• try-with-resources

• Varargs warnings

Page 14: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

14 | © 2011 Oracle Corporation

Varargs warnings

• Summary: no longer receive uninformative unchecked

compiler warnings from calling platform library methods:– <T> List<T> Arrays.asList(T... a)

– <T> boolean Collections.addAll(Collection<? super T> c,

T... elements)

– <E extends Enum<E>> EnumSet<E> EnumSet.of(E first,

E... rest)

– void javax.swing.SwingWorker.publish(V... chunks)

Page 15: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

15 | © 2011 Oracle Corporation

Coin features easy to use

• Type inference in diamond

• Internal compiler desugaring

– multi-catch

– strings in switch

– try-with-resources

More work for the compiler!

Page 16: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

16 | © 2011 Oracle Corporation

// Sugared

switch(s) {

case "a":

case "b":

case "c":

return 10;

case "d":

case "e":

case "f":

return 20;

...

}

// Desugared

int $t = -1;

switch(s.hashCode()) {

case 0x61: // "a".hashCode()

if(s.equals("a")) $t = 1; break;

case 0x62:

if(s.equals("b")) $t = 2; break;

... }

switch($t) {

case 1:

case 2:

case 3:

return 10;

case 4:

case 5:

case 6:

return 20;

...

}

Page 17: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

17 | © 2011 Oracle Corporation

// Sugared

switch(s) {

case "a":

case "b":

case "c":

return 10;

case "d":

case "e":

case "f":

return 20;

...

}

// Desugared

int $t = -1;

switch(s.hashCode()) {

case 0x61: // "a".hashCode()

if(s.equals("a")) $t = 1; break;

case 0x62:

if(s.equals("b")) $t = 2; break;

... }

switch($t) {

case 1:

case 2:

case 3:

return 10;

case 4:

case 5:

case 6:

return 20;

...

}

Page 18: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

18 | © 2011 Oracle Corporation

try-with-resources desugaring

try ResourceSpecification

Block

{

final VariableModifiers_minus_final R #resource = Expression;

Throwable #primaryException = null;

try ResourceSpecificationtailBlock

catch (Throwable #t) {

#primaryException = t;

throw #t;

} finally {

if (#resource != null) {

if (#primaryException != null) {

try {

#resource.close();

} catch(Throwable #suppressedException) {

#primaryException.addSuppressed(#suppressedException);

}

} else {

#resource.close();

}

}

}

}

Page 19: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

19 | © 2011 Oracle Corporation

Library support

• New superinterface java.lang.AutoCloseable

– All AutoCloseable and by extension java.io.Closeable

types usable with try-with-resources

• Retrofit Closeable/AutoCloseable to Java SE API– JDBC 4.1 retrofitted as AutoCloseable too

• Suppressed exceptions are recorded for posterity using a new facility Throwable.addSuppressed

– Suppressed exception info included in stack trace, etc.

try-with-resources isn’t just a language feature

Page 20: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

20 | © 2011 Oracle Corporation

Minty fresh libraries in JDK 7

• Retrofit Project Coin features in the JDK code base

– Improve the existing code base

– Validate the design of features through use

• Detectors / converters applied for– Diamond, try-with-resources

– “JDK7, Coin, and Making Libraries Fresh and Minty,”http://stuartmarks.wordpress.com/2010/12/23/jdk7-coin-and-making-libraries-fresh-and-minty/

• Also used in new library and test code– try-with-resources in JSR 203/NIO2 utility methods

Better JDK coding through “coinification”

Page 21: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

21 | © 2011 Oracle Corporation

A Systematic Update

• Automated code conversion for coinification

• Ran annotation processors over the JDK– Types to be retrofitted as Closeable/AutoCloseable:

“Project Coin: Bringing it to a Close(able),”http://blogs.sun.com/darcy/entry/project_coin_bring_close/

– Methods and constructors to be annotated with @SafeVarargs“Project Coin: Safe Varargs in JDK Libraries,”http://blogs.sun.com/darcy/entry/project_coin_safe_vararg_libraries/

• Quantitative language design

Page 22: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

22 | © 2011 Oracle Corporation

Language design for the real world: Diamond

• Two inference algorithms were considered for diamond

– Differed in how constraints were gathered

• Sometimes the 1st algorithm was more useful, but

other times the 2nd algorithm was more useful

• What to do?

– Is either one any good?

– How to choose between them?

• Look at relative performance on a body of code

Page 23: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

23 | © 2011 Oracle Corporation

Diamond outcome

• Both algorithms were equally effective

– Type arguments eliminated in 90% of constructor calls

– A slightly different 90% for each algorithm

• Choose the algorithm with better future evolution

properties

On a body of millions of lines of code…

Page 24: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

24 | © 2011 Oracle Corporation

The importance of source compatibilityA migration issue with more precise rethrow?

try {

throw new DaughterOfFoo();

} catch (Foo e) {

try {

throw e; // Used to be treated as throwing Foo,

// would now throw DaughterOfFoo

} catch (SonOfFoo anotherException) {

; // Reachable?

}

}

Page 25: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

25 | © 2011 Oracle Corporation

Should the feature be explicitly requested?

try {

throw new DaughterOfFoo();

} catch (final Foo e) {

try {

throw e; // Used to be treated as throwing Foo,

// would now throw DaughterOfFoo

} catch (SonOfFoo anotherException) {

; // Reachable?

}

}

Page 26: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

26 | © 2011 Oracle Corporation

No; problem doesn’t occur in practiceMore precise analysis by default, easy path to migrate code

try {

throw new DaughterOfFoo();

} catch (Foo e) {

try {

throw e; // Used to be treated as throwing Foo,

// would now throw DaughterOfFoo

} catch (SonOfFoo anotherException) {

; // Reachable?

}

}

Page 27: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

27 | © 2011 Oracle Corporation

Conclusion

• Project Coin features are easy to use today!

– Ease writing readable and reliable code

– Tooling support in IDEs

– Systematic platform upgrade

Page 28: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

28 | © 2011 Oracle Corporation

Q&A

blogs.oracle.com/darcy

Page 29: © 2011 Oracle Corporation ... © 2011 Oracle Corporation Coin features easy to use ... More precise analysis by default,

29 | © 2011 Oracle Corporation