4. Java
• Released in 1995
• Major library enhancements in 1.2
(1998)
• JIT compiler in 1.3 (2000)
• Two-year cycle…until 1.6 (2006)
5. Sun Versus Apache
• Apache wanted TCK to test Harmony
• Sun could/would not release TCK
• Apache retaliated by voting no on Java
7
• Java was stuck at 1.6 for five years
6. •OPurshaesc Jlaeva 7T tharokugeh JsC PO, agvaiensrt
Apache
• Oh noes…they are evil like we
thought!
• Doubles down on OpenJDK
• Ok, more support, more resources ++
• Back to two-year cycle, aggressive
features
• Invokedynamic, lambda, modules,
generics
8. OpenJDK Community
• Dozens of companies contributing now
• Most JVMs are OpenJDK-based
• Former competitors enhancing
OpenJDK
• It’s a big ol’ OSS love-fest
17. Things We Like About
JVM
• Bytecode intermediate form
• Freedom from native libraries
• Optimizing JIT
• It just works (usually)
18. Things That Make
JRuby Difficult
• JVM bytecode tailored to Java features
• Native libraries too hard to use
• Black box forces us to guess and pray
21. History
• JVM authors mentioned non-Java
languages
• Language authors have targeted JVM
• Hundreds of JVM languages now
• But JVM was a mismatch for many of
them
• Usually required tricks that defeated
JVM optimizations
• Or required features JDK could not
provide
22. JVM Opcodes
Invocation
invokevirtual
invokeinterface
invokestatic
invokespecial
Field Access
getfield
setfield
getstatic
setstatic
Array Access
*aload
*astore
b,s,c,i,l,d,f,a
Stack Local Vars
Flow Control
Allocation
Boolean and Numeric
23. "In the future, we will consider bounded extensions to the Java Virtual
Machine to provide better support for other languages."
- JVM Specification First Edition (1997), preface
24. Goals of JSR 292
• A user-definable bytecode
• Full freedom to define VM behavior
• Fast method pointers + adapters
• Caching and invalidation
• Avoid future modifications
30. invokestatic
1. Confirm arguments are of correct
type
2. Look up method on Java class
3. Cache method
4. Invoke method
invokevirtual
1. Confirm object is of correct type
2. Confirm arguments are of correct type
3. Look up method on Java class
4. Cache method
5. Invoke method
invokeinterface
1. Confirm object’s type implements interface
2. Confirm arguments are of correct type
3. Look up method on Java class
4. Cache method
5. Invoke method
invokespecial
1. Confirm object is of correct type
2. Confirm arguments are of correct type
3. Confirm target method is visible
4. Look up method on Java class
5. Cache method
6. Invoke method
invokestatic
invokevirtual
invokeinterface
invokespeciianlvokedynamic
1. Call your bootstrap code
2. Bootstrap wires up a target function
3. Target function invoked directly until you change it
33. Indy Languages
• New language impls
• JavaScript: Dyn.js and Nashorn
• Redline Smalltalk
• Improved language performance
• JRuby, Groovy, Jython
• Java features too!
34. Indy in JRuby
• Method dispatch
• Look up method, cache, invalidate if
class changes or a new type is seen
• Constant lookup
• Retrieve constant, cache, invalidate if
redefined
36. 2.48
red/black tree, pure Ruby versus native
0.51
0.29
0 0.75 1.5 2.25 3
ruby-2.0.0 + Ruby
ruby-2.0.0 + C ext
jruby + Ruby
Runtime per iteration
37. Lambda (8)
• Long-awaited closure support for Java
• Similar to inner classes, but…
• Lazily generate function class
• Single object constructed, cached
• All shared state passed on call stack
39. Generic Specialization
(9)
• ArrayList<int> that actually uses int
• Indy call site requests int-specialization
• int version of class generated lazily
• Working prototypes now in Valhalla
40. What Else?
• JRuby working to pre-optimize more
code
• JVM folks working on startup time
issues
• What about non-JVM languages?
55. Java Native Runtime
• Java API
• for calling Native code
• supported by a rich Runtime library
• You may be familiar with JNA
• Foreign Function Interface (FFI)
• https://github.com/jnr
56. import jnr.ffi.LibraryLoader;
import jnr.ffi.annotations.IgnoreError;
public class GetPidJNRExample {
public interface GetPid {
long getpid();
}
public static void main( String[] args ) {
GetPid getpid = LibraryLoader
.create(GetPid.class)
.load("c");
getpid.getpid();
}
}
JNR
58. Platforms
• Darwin (OS X): universal (+ppc?)
• Linux: i386, x86_64, arm, ppc, ppc64, s390x
• Windows: i386, x86_64
• FreeBSD, OpenBSD: i386, x86_64
• SunOS: i386, x86_64, sparc, sparcv9
• AIX: ppc
• OpenVMS, AS/400: builds out there somewhere
• If your platform isn't here, contribute a build
59. jnr-ffi
• User-oriented API
• Roughly equivalent to what JNA gives
you
• Functions, structs, callbacks, memory
• https://github.com/jnr/jnr-ffi
60. jnr-posix
• Pre-bound set of POSIX functions
• Mostly driven by what JRuby, Jython
use
• Goal: 100% of POSIX bound to Java
61. public int getpgid();
public int getpgid(int i);
public int getpgrp();
public int getpid();
public int getppid();
public Passwd getpwent();
public Passwd getpwuid(int i);
public Passwd getpwnam(String string);
public Group getgrgid(int i);
public Group getgrnam(String string);
public int getuid();
public boolean isatty(FileDescriptor fd);
public int kill(int i, int i1);
public int symlink(String string, String string1);
public int link(String string, String string1);
public String readlink(String string) throws IOException;
public String getenv(String string);
public int setenv(String string, String string1, int i);
public int unsetenv(String string);
public int getpriority(int i, int i1);
public int setpriority(int i, int i1, int i2);
public int setuid(int i);
public FileStat stat(String string);
public int stat(String string, FileStat fs);
public int umask(int i);
62. POSIX posix = POSIXFactory.getPOSIX(
new MyPOSIXHandler(this),
isNativeEnabled);
64. public class NativeSocketChannel
extends AbstractSelectableChannel
implements ByteChannel, NativeSelectableChannel {
public NativeSocketChannel(int fd);
public NativeSocketChannel(int fd, int ops);
public final int validOps();
public final int getFD();
public int read(ByteBuffer dst) throws IOException;
public int write(ByteBuffer src) throws IOException
public void shutdownInput() throws IOException;
public void shutdownOutput() throws IOException;
}
65. jnr-unixsocket
• UNIX sockets for NIO
• Built atop jnr-enxio
• Fully selectable, etc
• https://github.com/jnr/jnr-unixsocket
66. What Else?
• NIO, NIO.2
• Native IO, symlinks, FS-walking,
• Unmanaged memory
• Selectable stdio, process IO
• Low-level or other sockets (UNIX, ICMP,
...)
• New APIs (graphics, crypto, OS, ...)
67. Performance
• Generated code leading to JNI call
• Generated assembly version of native
part
• jnr-x86asm: Generate and link ASM
• Used internally by jnr
• https://github.com/jnr/jnr-x86asm
68. 100000
10000
1000
100
10
1
JNA getpid JNR getpid
getpid calls, 100M times
69. import jnr.ffi.LibraryLoader;
import jnr.ffi.annotations.IgnoreError;
public class GetPidJNRExample {
public interface GetPid {
@IgnoreError
long getpid();
}
public static void main( String[] args ) {
GetPid getpid = LibraryLoader
.create(GetPid.class)
.load("c");
getpid.getpid();
}
@IgnoreError
70. 2500
2000
1500
1000
500
0
JNR getpid JNR getpid @IgnoreError
getpid calls, 100M times
71. But There's More to
2500
2000
1500
1000
500
0
Do
JNR getpid JNI JNR @IgnoreError GCC -O3
getpid calls, 100M times
72. Project Panama
• JEP-191: FFI for the JVM
• Native interop at platform level
• JIT intelligence
• Security
• Native method handles
• Native memory layout and manipulation
74. Out of our control
Written in C++
JVM
Language
JVM
Bytecode
Bytecode
Interpreter
Bytecode
JIT
Native
Code
75. What If…
• The JVM’s JIT optimizer were written in
Java
• You could customize how the JIT works
for your language or library
• JITed code could directly make native
calls
76. Graal
• A 100% Java-based JIT framework
• Grew out of the 100% Java “Maxine”
JVM
• Emits assembly or HotSpot IR
• Directly control code generation
• Route around JVM bytecode
• http://openjdk.java.net/projects/graal/
77. Language
Plain Java APIs
Under your control
JVM
Graal
Intermediate
Representati
on
Graal
Optimizer
Native
Code
Your
Optimizations
78. However…
• Not everyone is a compiler writer
• Graal’s IR is low-level and nontrivial
• Need to understand JVM internals
• Need some understanding of CPU
79. The Dream
• Design your language
• ???
• PROFIT
80. What We Want
• Design your language
• Write an interpreter
• PROFIT
81. Truffle
• Language framework built on Graal
• Designed to fulfill the dream
• Implement interpreter
• Truffle feeds that to backend
• No compiler expertise needed
• https://wiki.openjdk.java.net/display/Graal/Truffle+FAQ+and+Guid
elines
82. JVM
Language
Truffle
AST
Graal
Intermediate
Representatio
n
Graal
Optimize
r
Native
Code
All we need
83.
84.
85. The Payoff
• RubyTruffle now part of JRuby
• Released in JRuby 9k
• Many languages in the works
• May become part of OpenJDK
releases?
• Forcing Hotspot folks to push harder