The Java Virtual Machine is Over - The Polyglot VM is here - Marcus Lagergren (Oracle)

Post on 20-Aug-2015

2.696 views 2 download

Transcript of The Java Virtual Machine is Over - The Polyglot VM is here - Marcus Lagergren (Oracle)

The JVM is dead! Long live the Polyglot VM! Marcus Lagergren Oracle

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 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."

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 3

Who am I?

@lagergren

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 4

Program Agenda

§  Introduction

§  History of VM languages and runtimes

§  Emerging languages and language design on top of the JVM

§  Invokedynamic

§  The Nashorn project

§  The Da Vinci Machine Project (MLVM)

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 5

Introduction

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 6

I am here to talk about…

The Java Runtime: The JVM

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 7

I am here to talk about…

The Universal Meta-Execution Environment

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 8

I am here to talk about…

The Universal Meta-Execution Environment

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 9

I am here to talk about…

The JVM as a multi language runtime

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 10

I am here to talk about…

The JVM as a multi language runtime

(especially in the context of dynamic languages)

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 11

History (what is a runtime

anyway?)

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 12

LISP

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 13

LISP

1950s – First compiler in 1962

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 14

LISP

1950s – First compiler in 1962 Just-in-time compilation

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 15

LISP

1950s – First compiler in 1962 Just-in-time compilation

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 16

LISP

1950s – First compiler in 1962 Just-in-time compilation GC – Reference Counting

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 17

LISP

1950s – First compiler in 1962 Just-in-time compilation GC – Reference Counting

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 18

Smalltalk

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 19

Smalltalk

First class library

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 20

Smalltalk

First class library First visual GUI driven IDE

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 21

Smalltalk

First class library First visual GUI driven IDE BYTECODE!

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 22

Smalltalk

First class library First visual GUI driven IDE BYTECODE!

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 23

Emerging languages (especially on the

JVM)

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 24

Dynamic Languages

ActionScript Adenine APL BASIC BeanShell Clojure ColdFusion Dart Dylan Groovy E Fancy JavaScript

Julia Lua MATLAB Objective-C Perl PHP Powershell Python Qore R

REBOL REXX Ruby Scheme Smalltalk Snit Tcl VBScript Yoix etc

etc etc etc…

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 25

Dynamic Languages

ActionScript Adenine APL BASIC BeanShell Clojure ColdFusion Dart Dylan Groovy E Fancy JavaScript

Julia Lua MATLAB Objective-C Perl PHP Powershell Python Qore R

REBOL REXX Ruby Scheme Smalltalk Snit Tcl VBScript Yoix etc

etc etc etc…

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 26

Dynamic Languages

•  Dynamic Languages are hot today because •  They are easy to use •  They have no explicit compile stage •  They have good code readability •  Allow short development time for small projects •  Performance is good enough

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 27

Trendy Dynamic Languages

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 28

Trendy Dynamic Languages

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 29

Trendy Dynamic Languages

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 30

Trendy Dynamic Languages

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 31

Trendy Dynamic Languages

Already on top of the JVM

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 32

Trendy Dynamic Languages

Already on top of the JVM

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 33

… and of course

V8, Futhark, Carakan, SpiderMonkey, JägerMonkey, *Monkey, Nitro, Rhino, Nashorn, etc etc

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 34

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 35

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 36

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 37

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 38

Dynamic Languages – Implementation

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 39

Dynamic Languages – Implementation

•  Native Runtimes •  Ruby, Perl, Python, v8, *monkey etc

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 40

Dynamic Languages – Implementation

•  Native Runtimes •  Ruby, Perl, Python, v8, *monkey etc

•  Metacircular •  PyPy, Steel Banks Common LISP, Rubinius (well

partly), Smalltalk

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 41

Dynamic Languages – Implementation

•  Native Runtimes •  Ruby, Perl, Python, v8, *monkey etc

•  Metacircular •  PyPy, Steel Banks Common LISP, Rubinius (well

partly), Smalltalk •  On top of a (J)VM

•  Clojure, Jython, JRuby, Rhino, Nashorn •  DLR/CLR

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 42

Dynamic Languages – Implementation

•  Native Runtimes •  Ruby, Perl, Python, v8, *monkey etc

•  Metacircular •  PyPy, Steel Banks Common LISP, Rubinius (well

partly), Smalltalk •  On top of a (J)VM

•  Clojure, Jython, JRuby, Rhino, Nashorn •  DLR/CLR

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 43

Dynamic Languages – Characteristics

•  Most emerging JVM languages today are dynamic •  As opposed to “non-dynamic” I guess… •  What is a dynamic language? •  Is there a formal definition?

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 44

Dynamic Languages – Characteristics

•  Loosely typed •  Dynamic binding

•  Resolve functions/members/calls at runtime rather than compile time

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 45

Dynamic Languages – Characteristics

•  Liberal redefinition policy •  Redefine/modify a class •  Redefine/modify a function

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 46

Dynamic Languages – Characteristics

•  Liberal redefinition policy •  Redefine/modify a class •  Redefine/modify a function •  Redefine a builtin even •  Oh, go to hell, JavaScript!

Math.sin = function(x){ return 17; }

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 47

Dynamic Languages – Characteristics

•  Code equals data •  eval / REPL •  Automatic memory management

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 48

Dynamic Languages – Characteristics

•  But you can extend Java at runtime too, can’t you? •  Maybe a “non dynamic” language is more like C? •  I don’t think the “dynamic” prefix matters much

•  Things change at runtime – handle it

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 49

Putting your language on top of the JVM

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 50

Why?

•  You get so much for free •  Automatic memory management •  State of the art JIT optimizations •  Native threading capability •  Hybridization (JSR-223) •  Man decades of high tech

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 51

Why?

0

100000

200000

300000

400000

500000

Code bases

Lines

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 52

Why?

0

100000

200000

300000

400000

500000

Code bases

Lines

If it were all about code complexity – TOTALLY WORTH IT!

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 53

“All problems in computer science can be solved by another level of indirection”

- David Wheeler

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 54

“All problems in computer science can be solved by another level of indirection”

- David Wheeler

•  Sounds good! Implement it! •  Just serve up some bytecode •  People have been doing it since 1996

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 55

They have been doing it a lot, actually…

Fantom

Fortress

BeanShell

Jaskell

ANTLR

ABCL

Erjang

X10

jgo

Nice

Gosu

Jacl

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 56

“All problems in computer science can be solved by another level of indirection”

- David Wheeler

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 57

“All problems in computer science can be solved by another level of indirection”

- David Wheeler

“Except for the problem of too many layers of indirection” - Kevlin Henney

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 58

So why is it hard?

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 59

So why is it hard?

•  Different levels of “hard” •  Square peg, round hole or round peg, oval hole? •  Scala is a fairly good fit*

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 60

So why is it hard?

•  Different levels of “hard” •  Square peg, round hole or round peg, oval hole? •  Scala is a fairly good fit*

•  yes I know about tail call optimization and interface injection – also I was at JVMLS 2013 which left me with mental scars.

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 61

So why is it hard?

•  Different levels of “hard” •  Square peg, round hole or round peg, oval hole? •  Scala is a fairly good fit •  Ruby or JavaScript are (at least at first glance) pretty

lousy ones

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 62

So why is it hard?

•  Java bytecode [sic] •  Notice the “Java”

•  There are “classes”, “methods”, size limitations, strong types

•  Languages can be much more dynamic than Java •  Different linkage •  Loose types

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 63

Not every language has exactly 5 strong types

int, long, float, double, Object int sum(int a, int b) { return a + b; }

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 64

Not every language has exactly 5 strong types

int, long, float, double, Object iload_1 iload_2 iadd ireturn

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 65

Not every language has exactly 5 strong types

int, long, float, double, Object function sum(a, b) { return a + b; }

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 66

Not every language has exactly 5 strong types

int, long, float, double, Object ???? ???? ???? ????

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 67

Not every language has exactly 5 strong types

int, long, float, double, Object ???? ???? ???? ????

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 68

Also: it is hard to swap out code with other code

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 69

Also: it is hard to swap out code with other code

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 70

Applicability and performance

•  The extra layer costs us performance •  How can we work around it?

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 71

Applicability and performance

•  The extra layer costs us performance •  How can we work around it? •  Passive

•  Just wait •  JIT is getting better all the time, GC is getting better

all the time

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 72

Applicability and performance

•  The extra layer costs us performance •  How can we work around it? •  Passive

•  Just wait •  JIT is getting better all the time, GC is getting better

all the time •  Active

•  Punch through the indirection layer •  There are tools these days

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 73

Punch through the indirection layer

invokedynamic is my ice pick!

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 74

Invokedynamic

•  The first new bytecode since 1996 •  More than new type of call •  Breaks the constraints of Java call/linkage •  Can implement calls that act like function pointers •  More general: can implement custom data access

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 75

The whole point: The JVM can optimize this!

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 76

invokedynamic bytecode

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 77

invokedynamic bytecode

Bootstrap Method

Calls (once)

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 78

invokedynamic bytecode

Bootstrap Method

java.lang.invoke.CallSite CallSite

Calls (once)

Returns

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 79

invokedynamic bytecode

Bootstrap Method

java.lang.invoke.CallSite CallSite

Target java.lang.invoke.MethodHandle

Calls (once)

Returns

Contains

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 80

Example – bootstrap

public static CallSite bootstrap( MethodHandles.Lookup lookup, String name,

MethodType type, Object... metainfo) { //optional

MethodHandle mh = lookup.findStaticMethod( getClass(),

name, type);

return new MyMutableCallsite(mh, metainfo); }

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 81

Example – java.lang.invoke •  MutableCallSite (ConstantCallSite)

•  setTarget, getTarget

•  MethodHandles •  guardWithTest

•  filterArguments •  filterReturnValue •  dropArguments

•  etc •  SwitchPoint

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 82

Example – dynamic invocation

•  Parameter types known only at run time function add(a, b) {

return a + b; } var res = add(f(), g());

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 83

Example – dynamic invocation

•  Parameter types known only at run time function add(a, b) {

return a + b; } var res = add(f(), g());

int add_int(int a, int b) { return a + b; }

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 84

Example – dynamic invocation

•  Parameter types known only at run time function add(a, b) {

return a + b; } var res = add(f(), g()); int add_int(int a, int b) { return a + b; }

Object add_obj(Object a, Object b){ return JavaScript.ADD(a, b); }

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 85

Example – dynamic invocation

•  Parameter types known only at run time var res = add(f(), g());

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 86

Example – dynamic invocation

•  Parameter types known only at run time var res = add(f(), g());

boolean intsGuard(Object a, Object b) { return a.getClass() == Integer.class && b.getClass() == Integer.class; }

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 87

Example – dynamic invocation

•  Parameter types known only at run time var res = add(f(), g());

boolean intsGuard(Object a, Object b) { return a.getClass() == Integer.class && b.getClass() == Integer.class; }

MethodHandle ADD = MethodHandles.guardWithTest( intsGuard, add_int, add_obj);

Object res = ADD(f(), g());

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 88

Example – function call reassignment function square(x) { return x * x; } function multiply(x) { return x * 2; } function compute(x) { return square(x) + multiply(x); }

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 89

Example – function call reassignment function square(x) { return x * x; } function multiply(x) { return x * 2; } function compute(x) { return square(x) + multiply(x); } multiply = function(x) { return x * 3; }

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 90

Example – function call reassignment function square(x) { return x * x; } function multiply(x) { return x * 2; } function compute(x) { return square(x) + multiply(x); } multiply = function(x) { return x * 3; }

UH OH!

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 91

Example – lazy constant initialization

•  Call site with one value, available only at runtime •  The “static final” approach won’t work

•  Value calculated once and remains immutable

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 92

Example – lazy constant initialization

•  Call site with one value, available only at runtime •  The “static final” approach won’t work

•  Value calculated once and remains immutable

return new ConstantCallSite( MethodHandles.constant(

Data.class, loadDataFromDataBase());

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 93

Java 8 also uses invokedynamic

(Delegators with lambda)

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 94

The Nashorn Project

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 95

What is Nashorn?

•  Nashorn is a 100% pure Java runtime for JavaScript •  Nashorn generates bytecode

•  Invokedynamics are everywhere •  Nashorn currently performs somewhere on the order of

~2-10x better than Rhino •  Nashorn is in JDK 8 •  Nashorn is 100% ECMAScript compliant •  Nashorn has a well thought through security model

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 96

Why Nashorn?

•  Started as an invokedynamic POC. •  Rhino is still alive today after ~18 years. Why?

•  JSR-223 •  Nashorn is now mature and replaces Rhino for Java 8

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 97

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 98

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 99

Rationale – JavaScript?

•  Extremely dynamic •  All (well, most) setters, getters, calls, have to be

invokedynamics •  Rhino is slow and old •  JSR-223

•  Should make it easy to provide POC apps for Nashorn

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 100

Rationale

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 101

Full ECMAScript compliance

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 102

Performance

rhino nashorn

0 1 2 3 4 5 6 7 8

rhino

nashorn

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 103

Performance

rhino nashorn

0 1 2 3 4 5 6 7 8

rhino

nashorn

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 104

Nashorn current performance status

•  As of late August: •  No longer understaffed for performance •  We should try for native-like performance by

•  Modifying the JVM’s invokedynamic implementation

•  Changing Nashorn’s currently conservative type model.

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 105

•  Key to native like performance •  In Nashorn: replace conservative types with

optimistic ones – implement rollback mechanism •  In the VM: math intrinsics (done), lambdaform

performance, better inlining, boxing

Nashorn current performance status

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 106

Nashorn current performance status

•  (Very) initial POC after 2.5 weeks of work: •  Broke out octane.crypto.am3 – the hotspot in

the Crypto benchmark in octane. •  Turned it into microbenchmark

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 107

Nashorn current performance status

•  Runtime

•  Rhino (with –opt 9): 34.6 s •  Nashorn tip: 10.8 s •  V8 1.3 s

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 108

Nashorn with optimistic types

•  Runtime

•  Rhino (with –opt 9): 34.6 s •  Nashorn tip: 5.8 s •  V8 1.3 s

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 109

Add JVM math intrinsics…

•  Runtime

•  Rhino (with –opt 9): 34.6 s •  Nashorn tip: 4.4 s •  V8 1.3 s

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 110

Patch JVM to keep more type info while inlining…

•  Runtime

•  Rhino (with –opt 9): 34.6 s •  Nashorn tip: 2.5 s •  V8 1.3 s

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 111

More information

•  We now run larger apps •  My JVMLS 2013 talk “Nashorn War Stories”

•  http://tinyurl.com/nashorn-war-stories-slides

•  http://tinyurl.com/nashorn-war-stories

(unshortened URLs)

http://www.slideshare.net/lagergren/lagergren-jvmls2013final

http://medianetwork.oracle.com/video/player/2630340183001

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 112

Nashorn on the Server: Avatar.js

•  Server side JavaScript on the JVM •  An implementation of the node programming model

•  For writing enterprise applications in Java and JavaScript

•  Automatically provides seamless integration with existing Java libraries

•  Parallelism / background Java threads •  Small enough for the embedded space •  http://avatar-js.java.net

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 113

Further POC: Askari Debugger

•  Debugger for Nashorn written in Nashorn •  Replace / view code while writing it •  3 weeks of work to get it up and running

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 114

Nashorn already in OpenJDK 8

Now: more Nashorn performance enhancements

Now: more JVM performance

enhancements

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 115

Contribute! 1.  Ask the community to contribute

functionality, testing, performance [analysis], bug fixes, library optimizations, browser simulation frameworks, kick-ass hybrid Java solutions. JVM optimizations

2.  … 3.  PROFIT!

blogs.oracle.com/nashorn

nashorn-dev@openjdk.java.net

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 116

The Da Vinci Machine Project

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 117

Can we do better than the ice pick?

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 118

Can we do better than the ice pick?

•  Reshape the hole!

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 119

Let’s continue building our “future VM”

•  An open source incubator for JVM futures •  Contains code fragments (patches) •  Migration to OpenJDK requires

•  A standard •  A feature release plan

mlvm-dev@openjdk.java.net

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 120

Da Vinci Machine Patches

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 121

It’s not just invokedynamic!

The JVM is evolving to become the multi-language runtime

Copyright © 2013, Oracle and/or its affiliates. All rights reserved. 122

Thank you!

Q&A? @lagergren