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å.
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.
2
3. <Insert Picture Here>
2
invokedynamic på 20 minuter
Joel Borggrén-Franck <joel.franck@oracle.com>
Java Platform Group
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
4
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
5
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)...))
6
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
7
8. <Insert Picture Here>
Coin på 20 minuter
Joel Borggrén-Franck <joel.franck@oracle.com>
Java Platform Group
9. Intro till JSR-334: Project Coin
Small change for Java
<Insert Picture Here>
• Kort bakgrund
• Vad innehåller Coin?
– Varför ska du bry dig?
9
10. Project Coin: Bakgrund
• 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
10
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
11
12. Underscores in numeric literals
• 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
12
13. Binary integral literals
• 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;
13
14. Strings in switch
• 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;
}
14
15. Strings in switch
• En switch förväntas vara snabb
• Strängjämförelse kan ta lång tid O(length)
• Transformera till 2 switchar
int pos = 0;
switch(s.hashCode()) {
String s = …
case ”foo”.hashCode():
switch(s){
if s.equals(”foo”)
case ”foo”: //pos==1
pos = 1;
…
case ”bar”.hashCode():
case ”bar”: //pos==2
…
}
switch (pos) {
case 1:
…
15
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;
}
18
19. Improved Type Inference for Generic Instance
Creation (diamond)
• Java 6:
Map<String, List<String>> myMap =
new HashMap<String, List<String>>();
• Java 7:
Map<String, List<String>> myMap = new
HashMap<>();
19
20. try-with-resources statement
• Spot the bugs:
ResourceHog r = new ResourceHog();
ResourceHog r2 = new AnotherResourceHog();
try {
doStuff();
} catch ( … ) {
…
} finally {
r.close();
r2.close();
}
20
21. try-with-resources statement
• 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();
}
21
22. try-with-resources statement
• I Java 7
try (ResourceHog r = new ResourceHog();
ResourceHog r2 = new AnotherResourceHog()) {
…
} catch ( … ) {
…
}
• Det kräver att ResourceHog implementerar interfacet
java.lang.auto.AutoClosable;
22