javaforum coin

Post on 20-May-2015

618 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

Vilka problem har man historiskt sett haft med att kompilera dynamiska språk till Java bytekod? Vad fanns för work-arounds? Vilka andra roliga saker kan man göra själv med Invokedynamic?Även om du bara har en vag bild på vad en bytekod överhuvudtaget är och varför du skall bry dig om en ny sådan så är det här en presentation som kommer att fördjupa din förståelse av Java på riktigt låg nivå.

TRANSCRIPT

1

2

The following is intended to outline our general

product direction. It is intended for information

purposes only, and may not be incorporated into

any contract. It is not a commitment to deliver any

material, code, or functionality, and should not

be relied upon in making purchasing decisions.

The development, release, and timing of any

features or functionality described for Oracle’s

products remains at the sole discretion of Oracle.

<Insert Picture Here>

invokedynamic på 20 minuter

Joel Borggrén-Franck <joel.franck@oracle.com>

Java Platform Group

2

4

• Det finns en mängd intressanta programmeringsspråk

• JVM:en är långt mycket mer avancerad än andra

VM:ar/runtimes

• Java är inte allas favoritspråk

• Naturligvis vill man köra alla nya spännande språk på

JVM:en

5

• Dynamiskt typade språk:

– Modifierar klasser vid körtid

– Alternativt, saknar klasser och lägger till properties i körtid

class ExampleClass

def exampleMethod

5

end

end

exampleObject.class.send(:define_method,

"aNewMethod") do

10

end

6

• Dynamiskt typade språk:

– har ofta inkompatibla sätt att definera/anropa metoder

(defun foo

(var...

&optional (var initform svar)...

&rest var

&key ((keyword var) initform svar)...

&aux (var initform)...))

7

Invokedynamic, en språkimplementatörs räddare i

nöden

• Invokedynamic är en brygga mellan

språkimplementatören och JVM:en

• Invokedynamic är en byggsten som gör det mycket

enklare att implementera andra språk än Java på

JVM:en

• Invokedynamic är awesome, om du gillar

språkimplementation

• Invokedynamic kommer säkert användas av Java

någon gång i framtiden

<Insert Picture Here>

Coin på 20 minuter

Joel Borggrén-Franck <joel.franck@oracle.com>

Java Platform Group

9

<Insert Picture Here>

Intro till JSR-334: Project Coin

Small change for Java

• Kort bakgrund

• Vad innehåller Coin?

– Varför ska du bry dig?

10

• Startade som en förfrågan till OpenJDK-communityn

• “Making things programmers do everyday easier.”

• Förslagen skulle vara små i:

– Specifikation

– Implementation

– Testning

• Över 70 förslag

– 1100 e-mail som diskuterade förslagen

Project Coin: Bakgrund

11

Project Coin: Bakgrund

• De 6 förslag som implementerades är:

– Binary integral literals and underscores in numeric literals

– Strings in switch

– Multi-catch and more precise rethrow

– Improved Type Inference for Generic Instance Creation

– try-with-resources statement

– Simplified Varargs Method Invocation

12

• Så om du ger mig en miljon, 100000

• Nya sätt att skriva tal (Iiterals)

• Både heltal och flyttal

• Ex:

– 1234_5678

– 0x1.ffff_ffff_ffff_fP1_023 // Double.MAX_VALUE

• Så om du ger mig en miljon, 1_000_000

Underscores in numeric literals

13

• För oss som jobbar med bitar

• ”Uh, så jag måste maska bit 12 och 13”

– ”val = val & 0xC00;”, right?

• Kanske bättre:– val = val & 0b1100000000000;

• Mycket bättre:– val = val & 0b1_1000_0000_0000;

• Eller i hex:– val = val & 0x1800;

Binary integral literals

14

• Java 6:

– switch on char, byte, short, int, Character, Byte,

Short, Integer or an enum type

• I Java 7 också String:

String s = ...;

switch (s) {

case "foo":

return 1;

case "bar":

return 2;

}

Strings in switch

15

• En switch förväntas vara snabb

• Strängjämförelse kan ta lång tid O(length)

• Transformera till 2 switchar

Strings in switch

String s = …

switch(s){

case ”foo”: //pos==1

case ”bar”: //pos==2

}

int pos = 0;

switch(s.hashCode()) {

case ”foo”.hashCode():

if s.equals(”foo”)

pos = 1;

case ”bar”.hashCode():

switch (pos) {

case 1:

16

Multi-catch and more precise rethrow

try {

foo();

bar();

} catch (IOException e) {

log(e); throw e;

} catch (FileNotFoundException e) {

log(e); throw e;

}

} catch (FooException e) {

log(e); throw e;

}

17

Multi-catch and more precise rethrow

•Eller

try {

foo();

bar();

} catch (Exception e) {

log(e); throw e;

}

18

Multi-catch and more precise rethrow

• I Java 7 kan vi nu fånga flera exceptions i samma catch-block:

try {

foo();

bar();

} catch (IOException |

FileNotFoundException |

FooException |

BarException e) {

log(e); throw e;

}

19

• Java 6:

Map<String, List<String>> myMap =

new HashMap<String, List<String>>();

• Java 7:

Map<String, List<String>> myMap = new

HashMap<>();

Improved Type Inference for Generic Instance

Creation (diamond)

20

• Spot the bugs:

ResourceHog r = new ResourceHog();

ResourceHog r2 = new AnotherResourceHog();

try {

doStuff();

} catch ( … ) {

} finally {

r.close();

r2.close();

}

try-with-resources statement

21

• Lösningen är jobbig:

ResourceHog r = new ResourceHog();

try {

ResourceHog r2 = new AnotherResourceHog();

try {

doStuff();

} catch ( … ) {

} finally {

if (null != r2) r2.close();

}

} finally {

if (null != r) r.close();

}

try-with-resources statement

22

• I Java 7

try (ResourceHog r = new ResourceHog();

ResourceHog r2 = new AnotherResourceHog()) {

} catch ( … ) {

}

• Det kräver att ResourceHog implementerar interfacet

java.lang.auto.AutoClosable;

try-with-resources statement

23

• Booring

Simplified Varargs Method Invocation

24

Q&A

top related