SlideShare a Scribd company logo
1 of 89
Download to read offline
❤
INVOKEDYNAMIC
Me
• Charles Oliver Nutter
• @headius, headius@headius.com
• JVM language developer at Red Hat
• JRuby co-lead since 2005
Agenda
• Brief intro to JRuby (and Ruby)
• Overview of invokedynamic
• Invokedynamic examples
• JRuby + invokedynamic
+
2001: JRuby is Born
2005: JRuby on Rails
2015: JRuby 9000
Ruby
• Created in 1995 byYukihiro Matsumoto
• Dynamically typed (dynamic calls)
• Object-oriented
• Everything is an object
• Tight integration with C, UNIX
Ruby
• Created in 1995 byYukihiro Matsumoto
• Dynamically typed (dynamic calls)
• Object-oriented
• Everything is an object
• Tight integration with C, UNIX
class Hello

def initialize(name)

@name = name

end



def display

puts "Hello, #{@name}"

end

end



hello = Hello.new

hello.display
Ruby == Method Calls
Thousands upon thousands of them.
Command Number of simple calls
jruby -e 1 1k
gem install rails 315k
rails new testapp 606k
rails simple CRUD 16k
def foo

bar

end



def bar

baz

end



def baz

# ...

end
foo bazbar
def foo

bar

end



def bar

baz

end



def baz

# ...

end
foo bar baz
JRuby
call
logic
JRuby
call
logic
Stops many JVM optimizations
JRuby before invokedynamic
JRuby
call
logic
Invocation
Target
Object
Object’s
Class
void foo()
static void bar()
instanceof
obj.foo() JRuby
void foo()
public abstract class CachingCallSite extends CallSite {



protected CacheEntry cache = CacheEntry.NULL_CACHE;



private final String methodName = ...


public IRubyObject call(...) {

RubyClass selfType = getClass(self);



CacheEntry cache = this.cache;



if (CacheEntry.typeOk(cache, selfType)) {

return cache.method.call(...);

}



return cacheAndCall(...);

}



protected IRubyObject cacheAndCall(...) {

CacheEntry entry = selfType.searchWithCache(methodName);



DynamicMethod method = entry.method;



if (methodMissing(method, caller)) {

return callMethodMissing(context, self, method);

}



updateCache(entry);



return method.call(context, self, selfType, methodName);

}

}
def foo

bar

end



def bar

baz

end



def baz

# ...

end
foo bar baz
JRuby
call
logic
JRuby
call
logic
Stops many JVM optimizations
JRuby before invokedynamic
JRuby
call
logic
Invokedynamic
"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
Goals of
InvokeDynamic
• A new bytecode
• Fast function pointers + adapters
• Caching and invalidation
• Flexible enough for future uses
How does it work?
Invoke
Invoke// Static
System.currentTimeMillis()
Math.log(1.0)
 
// Virtual
"hello".toUpperCase()
System.out.println()
 
// Interface
myList.add("happy happy")
myRunnable.run()
 
// Constructor and super
new ArrayList()
super.equals(other)
// Static
invokestatic java/lang/System.currentTimeMillis:()J
invokestatic java/lang/Math.log:(D)D
// Virtual
invokevirtual java/lang/String.toUpperCase:()Ljava/lang/String;
invokevirtual java/io/PrintStream.println:()V
// Interface
invokeinterface java/util/List.add:(Ljava/lang/Object;)Z
invokeinterface java/lang/Runnable.add:()V
// Special
invokespecial java/util/ArrayList.<init>:()V
invokespecial java/lang/Object.equals:(java/lang/Object)Z
invokestatic
invokevirtual
invokeinterface
invokespecial
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
invokedynamic
1. Call your language's logic
2. Install target function
3.Target function invoked directly until you change it
function pointers
invokedynamic
language
logic
target method
JVM
method handles
call site
bootstrap
target method
JVM
Method Handles
Method Handles
• Function/field/array pointers
• Argument manipulation
• Flow control
• Optimizable by the JVM
• This is very important
java.lang.invoke
•MethodHandles
• Utilities for acquiring, adapting handles
•MethodType
• Representation of args + return type
•MethodHandle
• An invokable target + adaptations
MethodHandles.Lookup
• Used to get function pointers
•MethodHandles.lookup()
• Obeys visibility of lookup() location
• Can expose private members
MethodHandle Targets
• Methods, constructors
• Fields
• Array elements
MethodHandles.Lookup
• Method pointers
•findStatic, findVirtual,

findSpecial,
findConstructor
• Field pointers
•findGetter, findSetter,

findStaticGetter,
findStaticSetter
// can access everything visible from here
MethodHandles.Lookup LOOKUP =
MethodHandles.lookup();
// can access only public fields and methods
MethodHandles.Lookup PUBLOOKUP =
MethodHandles.publicLookup();
String value1 = System.getProperty("foo");
MethodHandle m1 = lookup
        .findStatic(System.class, "getProperty",
MethodType.methodType(String.class, String.class));
String value2 = (String)m2.invoke("foo");
Static Method
// example Java
String value1 = System.getProperty("java.home");
 
// getProperty signature
MethodType type1 =
MethodType.methodType(String.class, String.class);
 
MethodHandle getPropertyMH = LOOKUP
.findStatic(System.class, "getProperty", type1);
 
// invoke
String value2 = (String) getPropertyMH.invoke("java.home");
// example Java
System.out.println("Hello, world");
 
// println signature
MethodType type2 =
MethodType.methodType(void.class, Object.class);
 
MethodHandle printlnMH = LOOKUP
.findVirtual(PrintStream.class, "println", type2);
 
// invoke
printlnMH.invoke(System.out, (Object) "Hello, world");
Adapters
• java.lang.invoke.MethodHandles.*
• Argument manipulation, modification
• Flow control and exception handling
• Similar to writing your own command-
pattern utility objects
Argument Juggling
• insert, drop, permute
• filter, fold
• splat (varargs), spread (unbox varargs)
// insert is like partial application
MethodHandle getJavaHomeMH =
MethodHandles.insertArguments(getPropertyMH, 0, "java.home");
 
// same as getProperty("java.home")
getJavaHomeMH.invokeWithArguments();
MethodHandle systemOutPrintlnMH =
MethodHandles.insertArguments(printlnMH, 0, System.out);
 
// same as System.out.println(...
systemOutPrintlnMH.invokeWithArguments("Hello, world");
Flow Control
• guardWithTest is a boolean branch
• Three targets
• Condition ("if")
• True path ("then")
• False path ("else")
// boolean branch
 
// example Java
class UpperDowner {
public String call(String inputString) {
if (randomBoolean()) {
return inputString.toUpperCase();
} else {
return inputString.toLowerCase();
}
}
}
// randomly return true or false
MethodHandle upOrDown = LOOKUP.findStatic(
BasicHandles.class,
"randomBoolean",
methodType(boolean.class));
// guardWithTest calls boolean handle and branches
MethodHandle upperDowner = guardWithTest(
upOrDown,
toUpperCaseMH,
toLowerCaseMH);
upperDowner.invoke("Hello, world"); // HELLO, WORLD
upperDowner.invoke("Hello, world"); // hello, world
upperDowner.invoke("Hello, world"); // HELLO, WORLD
upperDowner.invoke("Hello, world"); // HELLO, WORLD
upperDowner.invoke("Hello, world"); // hello, world
Bootstrap
Bootstrap
• First time JVM sees invokedynamic
• Call your bootstrap code with name, type
• Install resulting CallSite
• Subsequent times
• Just invoke call site contents
CallSite
• Holds a MethodHandle
• Returned to JVM by bootstrap method
• Replaces invokedynamic bytecode
• JVM watches it for changes
public static CallSite simpleBootstrap(
MethodHandles.Lookup lookup,
String name,
MethodType type) throws Exception {
 
// Create and bind a constant site, pointing at the named method
return new ConstantCallSite(
lookup.findStatic(SimpleBinding.class, name, type));
 
}
Mutable Call Sites
• Target can be changed
• Trivial example of late binding
public static void first(...) {
...
System.out.println("first!");
}
 
public static void second(...) {
...
System.out.println("second!");
}
 
callable.call(); // => "first!"
callable.call(); // => "second!"
callable.call(); // => "first!"
callable.call(); // => "second!"
public static CallSite mutableCallSiteBootstrap(
MethodHandles.Lookup lookup,
String name,
MethodType type) throws Exception {
MutableCallSite mcs = new MutableCallSite(type);
 
// look up the first method to call
MethodHandle target = <get handle to "first" method>
 
// add MutableCallSite into args
target = insertArguments(target, 0, mcs);
 
mcs.setTarget(target);
 
return mcs;
}
public static void first(
MethodHandles.Lookup lookup,
MutableCallSite mcs) throws Exception {
MethodHandle second = <get handle to "second" method>
 
mcs.setTarget(second);
 
System.out.println("first!");
}
public static void second(
MethodHandles.Lookup lookup,
MutableCallSite mcs) throws Exception {
MethodHandle first = <get handle to "first" method>
 
mcs.setTarget(first);
 
System.out.println("second!");
}
All Together
• Bytecode gets call site
• Method handle points at target method
• Call site caches it
• Guard ensures it's the right method
Invokedynamic in JRuby
Dynamic Invocation
• The obvious one
• Method lookup based on runtime types
• Potentially mutable types
• Type check specific to language
class Hello

def initialize(name)

@name = name

end



def display

puts "Hello, #{@name}"

end

end



hello = Hello.new

hello.display
def foo

bar

end



def bar

baz

end



def baz

# ...

end
foo bar baz
JRuby
call
logic
JRuby
call
logic
Stops many JVM optimizations
JRuby before invokedynamic
JRuby
call
logic
def foo

bar

end



def bar

baz

end



def baz

# ...

end
foo bar baz
JRuby
call
logic
JRuby
call
logic
Dynamic call logic built into JVM
JRuby on Java 7
JRuby
call
logic
X X
Dynamic Invocation
Target
Object
Method
Table
def foo ...
def bar ...
associated with
obj.foo() JVM
def foo ...
Call Site
def foo

bar

end



def bar

baz

end



def baz

# ...

end
foo bar baz
Straight through dispatch path
JRuby on Java 7
def foo

bar

end



def bar

baz

end



def baz

# ...

end
foo bar baz
Optimizations (like inlining) can happen!
JRuby on Java 7
Empty Method Call
10M calls to empty method
0
1.25
2.5
3.75
5
Time in seconds
Empty Method Call
10M calls to empty method
0.32
0.328
0.335
0.343
0.35
Time in seconds
Lazy Constants
• Call site just produces a value
• Value calculated once
• Subsequent access is direct, optimizable
• Used for numbers, strings, regexp
class Hello

def initialize(name)

@name = name

end



def display

puts "Hello, #{@name}"

end

end



hello = Hello.new

hello.display
Lazy Constants
Lazy
Computation
LAZY_CONST JVM
Call Site
value
Ruby Constants
• Ruby's constants can be modified
• ...but it is very rare
• Look up value
• Guard against it changing
class Hello

def initialize(name)

@name = name

end



def display

puts "Hello, #{@name}"

end

end



hello = Hello.new

hello.display
Constant Lookup
Look up "Foo" constant 10m times
0
0.3
0.6
0.9
1.2
Time in seconds
MRI JRuby Control
InstanceVariables
• Ruby objects grow as needed
• Look up offset for @var in object
• Cache offset, guard against other types
• Direct access to variable table
class Hello

def initialize(name)

@name = name

end



def display

puts "Hello, #{@name}"

end

end



hello = Hello.new

hello.display
MyObject
@foo
@bar
@baz
puts @foo
MyObject
@foo
@bar
@baz
puts @foo
Offset:1
MyObject
@foo
@bar
@baz
puts @foo
Offset:1
InstanceVariables
Look up @foo variable 10M times
0
0.15
0.3
0.45
0.6
Time in seconds
MRI JRuby Control
class Hello

def initialize(name)

@name = name

end



def display

puts "Hello, #{@name}"

end

end



hello = Hello.new

hello.display
Real World
bench_fractal
bench_flipflop_fractal
• Mandelbrot generator
• Integer loops
• Floating-point math
• Julia generator using flip-flops
• I don’t really understand it.
bench_fractal
0s
0.4s
0.8s
1.2s
1.6s
Iteration
0 1 2 3 4 5 6 7
Ruby 2.2.2 JRuby + indy
bench_flipflop_fractal
0s
0.375s
0.75s
1.125s
1.5s
Category Title
0 1 2 3 4 5 6 7 8 9
Ruby 2.2.2 JRuby + indy
Times Faster than Ruby 2.2.2
0
1
2
3
4
base64 richards neural
3.66
3.44
2.658
1.914
1.538
1.346
JRuby/Java 6 JRuby/Java 7
red/black tree, pure Ruby versus C ext
ruby-2.2.2 + Ruby
ruby-2.2.2 + C ext
jruby + Ruby
Runtime per iteration
0 0.75 1.5 2.25 3
0.29s
0.51s
2.48s
Future Work
• More creative use of invokedynamic in JRuby
• Smarter compiler above JVM byte code
• Continued JVM optimization
ThankYou!
• Charles Oliver Nutter
• @headius
• headius@headius.com
• https://github.com/jruby/jruby

More Related Content

What's hot

JVM for Dummies - OSCON 2011
JVM for Dummies - OSCON 2011JVM for Dummies - OSCON 2011
JVM for Dummies - OSCON 2011Charles Nutter
 
JavaOne 2011 - JVM Bytecode for Dummies
JavaOne 2011 - JVM Bytecode for DummiesJavaOne 2011 - JVM Bytecode for Dummies
JavaOne 2011 - JVM Bytecode for DummiesCharles Nutter
 
Øredev 2011 - JVM JIT for Dummies (What the JVM Does With Your Bytecode When ...
Øredev 2011 - JVM JIT for Dummies (What the JVM Does With Your Bytecode When ...Øredev 2011 - JVM JIT for Dummies (What the JVM Does With Your Bytecode When ...
Øredev 2011 - JVM JIT for Dummies (What the JVM Does With Your Bytecode When ...Charles Nutter
 
Mastering java bytecode with ASM - GeeCON 2012
Mastering java bytecode with ASM - GeeCON 2012Mastering java bytecode with ASM - GeeCON 2012
Mastering java bytecode with ASM - GeeCON 2012Anton Arhipov
 
Beyond JVM - YOW Melbourne 2013
Beyond JVM - YOW Melbourne 2013Beyond JVM - YOW Melbourne 2013
Beyond JVM - YOW Melbourne 2013Charles Nutter
 
Building High Performance Android Applications in Java and C++
Building High Performance Android Applications in Java and C++Building High Performance Android Applications in Java and C++
Building High Performance Android Applications in Java and C++Kenneth Geisshirt
 
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)goccy
 
Building a java tracer
Building a java tracerBuilding a java tracer
Building a java tracerrahulrevo
 
Everything you wanted to know about Stack Traces and Heap Dumps
Everything you wanted to know about Stack Traces and Heap DumpsEverything you wanted to know about Stack Traces and Heap Dumps
Everything you wanted to know about Stack Traces and Heap DumpsAndrei Pangin
 
JRuby @ Boulder Ruby
JRuby @ Boulder RubyJRuby @ Boulder Ruby
JRuby @ Boulder RubyNick Sieger
 
Oscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast LaneOscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast LaneAndres Almiray
 
The Art of JVM Profiling
The Art of JVM ProfilingThe Art of JVM Profiling
The Art of JVM ProfilingAndrei Pangin
 
Static or Dynamic Typing? Why not both?
Static or Dynamic Typing? Why not both?Static or Dynamic Typing? Why not both?
Static or Dynamic Typing? Why not both?Mario Camou Riveroll
 
Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!Sylvain Wallez
 
JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?Doug Hawkins
 
Mastering Java Bytecode - JAX.de 2012
Mastering Java Bytecode - JAX.de 2012Mastering Java Bytecode - JAX.de 2012
Mastering Java Bytecode - JAX.de 2012Anton Arhipov
 
Mastering Java Bytecode With ASM - 33rd degree, 2012
Mastering Java Bytecode With ASM - 33rd degree, 2012Mastering Java Bytecode With ASM - 33rd degree, 2012
Mastering Java Bytecode With ASM - 33rd degree, 2012Anton Arhipov
 
Down to Stack Traces, up from Heap Dumps
Down to Stack Traces, up from Heap DumpsDown to Stack Traces, up from Heap Dumps
Down to Stack Traces, up from Heap DumpsAndrei Pangin
 
GOTO Night with Charles Nutter Slides
GOTO Night with Charles Nutter SlidesGOTO Night with Charles Nutter Slides
GOTO Night with Charles Nutter SlidesAlexandra Masterson
 

What's hot (20)

JVM for Dummies - OSCON 2011
JVM for Dummies - OSCON 2011JVM for Dummies - OSCON 2011
JVM for Dummies - OSCON 2011
 
JavaOne 2011 - JVM Bytecode for Dummies
JavaOne 2011 - JVM Bytecode for DummiesJavaOne 2011 - JVM Bytecode for Dummies
JavaOne 2011 - JVM Bytecode for Dummies
 
Øredev 2011 - JVM JIT for Dummies (What the JVM Does With Your Bytecode When ...
Øredev 2011 - JVM JIT for Dummies (What the JVM Does With Your Bytecode When ...Øredev 2011 - JVM JIT for Dummies (What the JVM Does With Your Bytecode When ...
Øredev 2011 - JVM JIT for Dummies (What the JVM Does With Your Bytecode When ...
 
Mastering java bytecode with ASM - GeeCON 2012
Mastering java bytecode with ASM - GeeCON 2012Mastering java bytecode with ASM - GeeCON 2012
Mastering java bytecode with ASM - GeeCON 2012
 
Mastering Java ByteCode
Mastering Java ByteCodeMastering Java ByteCode
Mastering Java ByteCode
 
Beyond JVM - YOW Melbourne 2013
Beyond JVM - YOW Melbourne 2013Beyond JVM - YOW Melbourne 2013
Beyond JVM - YOW Melbourne 2013
 
Building High Performance Android Applications in Java and C++
Building High Performance Android Applications in Java and C++Building High Performance Android Applications in Java and C++
Building High Performance Android Applications in Java and C++
 
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
 
Building a java tracer
Building a java tracerBuilding a java tracer
Building a java tracer
 
Everything you wanted to know about Stack Traces and Heap Dumps
Everything you wanted to know about Stack Traces and Heap DumpsEverything you wanted to know about Stack Traces and Heap Dumps
Everything you wanted to know about Stack Traces and Heap Dumps
 
JRuby @ Boulder Ruby
JRuby @ Boulder RubyJRuby @ Boulder Ruby
JRuby @ Boulder Ruby
 
Oscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast LaneOscon Java Testing on the Fast Lane
Oscon Java Testing on the Fast Lane
 
The Art of JVM Profiling
The Art of JVM ProfilingThe Art of JVM Profiling
The Art of JVM Profiling
 
Static or Dynamic Typing? Why not both?
Static or Dynamic Typing? Why not both?Static or Dynamic Typing? Why not both?
Static or Dynamic Typing? Why not both?
 
Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!Inside the JVM - Follow the white rabbit!
Inside the JVM - Follow the white rabbit!
 
JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?JVM Mechanics: When Does the JVM JIT & Deoptimize?
JVM Mechanics: When Does the JVM JIT & Deoptimize?
 
Mastering Java Bytecode - JAX.de 2012
Mastering Java Bytecode - JAX.de 2012Mastering Java Bytecode - JAX.de 2012
Mastering Java Bytecode - JAX.de 2012
 
Mastering Java Bytecode With ASM - 33rd degree, 2012
Mastering Java Bytecode With ASM - 33rd degree, 2012Mastering Java Bytecode With ASM - 33rd degree, 2012
Mastering Java Bytecode With ASM - 33rd degree, 2012
 
Down to Stack Traces, up from Heap Dumps
Down to Stack Traces, up from Heap DumpsDown to Stack Traces, up from Heap Dumps
Down to Stack Traces, up from Heap Dumps
 
GOTO Night with Charles Nutter Slides
GOTO Night with Charles Nutter SlidesGOTO Night with Charles Nutter Slides
GOTO Night with Charles Nutter Slides
 

Viewers also liked

Viewers also liked (11)

SAP Support Authorization Danışmanlık Servisi
SAP Support Authorization Danışmanlık ServisiSAP Support Authorization Danışmanlık Servisi
SAP Support Authorization Danışmanlık Servisi
 
Mobile phones
Mobile phonesMobile phones
Mobile phones
 
A little motivation
A little motivationA little motivation
A little motivation
 
Sub. sustantivas resueltas
Sub. sustantivas resueltasSub. sustantivas resueltas
Sub. sustantivas resueltas
 
Research termo
Research termoResearch termo
Research termo
 
Signage
SignageSignage
Signage
 
Património à volta da Sé do Porto- Torre Pedro Pitões - Artur Filipe dos Sant...
Património à volta da Sé do Porto- Torre Pedro Pitões - Artur Filipe dos Sant...Património à volta da Sé do Porto- Torre Pedro Pitões - Artur Filipe dos Sant...
Património à volta da Sé do Porto- Torre Pedro Pitões - Artur Filipe dos Sant...
 
test upload
test uploadtest upload
test upload
 
McDonald's vs KFC
McDonald's vs KFCMcDonald's vs KFC
McDonald's vs KFC
 
Chapter 6 diagnosing the need and readiness for change
Chapter 6 diagnosing the need and readiness for changeChapter 6 diagnosing the need and readiness for change
Chapter 6 diagnosing the need and readiness for change
 
Fin Tech as a Disruptor of Financial Services
Fin Tech as a Disruptor of Financial ServicesFin Tech as a Disruptor of Financial Services
Fin Tech as a Disruptor of Financial Services
 

Similar to JRuby and Invokedynamic - Japan JUG 2015

Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov
Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov
Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov Nayden Gochev
 
Invokedynamic / JSR-292
Invokedynamic / JSR-292Invokedynamic / JSR-292
Invokedynamic / JSR-292ytoshima
 
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)James Titcumb
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing UpDavid Padbury
 
Back to the future with Java 7 (Geekout June/2011)
Back to the future with Java 7 (Geekout June/2011)Back to the future with Java 7 (Geekout June/2011)
Back to the future with Java 7 (Geekout June/2011)Martijn Verburg
 
No dark magic - Byte code engineering in the real world
No dark magic - Byte code engineering in the real worldNo dark magic - Byte code engineering in the real world
No dark magic - Byte code engineering in the real worldtcurdt
 
Supercharging reflective libraries with InvokeDynamic
Supercharging reflective libraries with InvokeDynamicSupercharging reflective libraries with InvokeDynamic
Supercharging reflective libraries with InvokeDynamicIan Robertson
 
Introduction to clojure
Introduction to clojureIntroduction to clojure
Introduction to clojureAbbas Raza
 
Object Oriented JavaScript
Object Oriented JavaScriptObject Oriented JavaScript
Object Oriented JavaScriptMichael Girouard
 
A brief tour of modern Java
A brief tour of modern JavaA brief tour of modern Java
A brief tour of modern JavaSina Madani
 
Java 7 Whats New(), Whats Next() from Oredev
Java 7 Whats New(), Whats Next() from OredevJava 7 Whats New(), Whats Next() from Oredev
Java 7 Whats New(), Whats Next() from OredevMattias Karlsson
 
TypeScript for Java Developers
TypeScript for Java DevelopersTypeScript for Java Developers
TypeScript for Java DevelopersYakov Fain
 
Introducing PHP Latest Updates
Introducing PHP Latest UpdatesIntroducing PHP Latest Updates
Introducing PHP Latest UpdatesIftekhar Eather
 
JavaOne 2016 - Learn Lambda and functional programming
JavaOne 2016 - Learn Lambda and functional programmingJavaOne 2016 - Learn Lambda and functional programming
JavaOne 2016 - Learn Lambda and functional programmingHenri Tremblay
 
Php 5.4: New Language Features You Will Find Useful
Php 5.4: New Language Features You Will Find UsefulPhp 5.4: New Language Features You Will Find Useful
Php 5.4: New Language Features You Will Find UsefulDavid Engel
 
A topology of memory leaks on the JVM
A topology of memory leaks on the JVMA topology of memory leaks on the JVM
A topology of memory leaks on the JVMRafael Winterhalter
 

Similar to JRuby and Invokedynamic - Japan JUG 2015 (20)

Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov
Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov
Lecture from javaday.bg by Nayden Gochev/ Ivan Ivanov and Mitia Alexandrov
 
Invokedynamic / JSR-292
Invokedynamic / JSR-292Invokedynamic / JSR-292
Invokedynamic / JSR-292
 
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
 
Exploring lambdas and invokedynamic for embedded systems
Exploring lambdas and invokedynamic for embedded systemsExploring lambdas and invokedynamic for embedded systems
Exploring lambdas and invokedynamic for embedded systems
 
Back to the future with Java 7 (Geekout June/2011)
Back to the future with Java 7 (Geekout June/2011)Back to the future with Java 7 (Geekout June/2011)
Back to the future with Java 7 (Geekout June/2011)
 
No dark magic - Byte code engineering in the real world
No dark magic - Byte code engineering in the real worldNo dark magic - Byte code engineering in the real world
No dark magic - Byte code engineering in the real world
 
Java 10, Java 11 and beyond
Java 10, Java 11 and beyondJava 10, Java 11 and beyond
Java 10, Java 11 and beyond
 
Supercharging reflective libraries with InvokeDynamic
Supercharging reflective libraries with InvokeDynamicSupercharging reflective libraries with InvokeDynamic
Supercharging reflective libraries with InvokeDynamic
 
Introduction to clojure
Introduction to clojureIntroduction to clojure
Introduction to clojure
 
Solr @ Etsy - Apache Lucene Eurocon
Solr @ Etsy - Apache Lucene EuroconSolr @ Etsy - Apache Lucene Eurocon
Solr @ Etsy - Apache Lucene Eurocon
 
Object Oriented JavaScript
Object Oriented JavaScriptObject Oriented JavaScript
Object Oriented JavaScript
 
A brief tour of modern Java
A brief tour of modern JavaA brief tour of modern Java
A brief tour of modern Java
 
Java 7 Whats New(), Whats Next() from Oredev
Java 7 Whats New(), Whats Next() from OredevJava 7 Whats New(), Whats Next() from Oredev
Java 7 Whats New(), Whats Next() from Oredev
 
TypeScript for Java Developers
TypeScript for Java DevelopersTypeScript for Java Developers
TypeScript for Java Developers
 
Introducing PHP Latest Updates
Introducing PHP Latest UpdatesIntroducing PHP Latest Updates
Introducing PHP Latest Updates
 
JavaOne 2016 - Learn Lambda and functional programming
JavaOne 2016 - Learn Lambda and functional programmingJavaOne 2016 - Learn Lambda and functional programming
JavaOne 2016 - Learn Lambda and functional programming
 
Php 5.4: New Language Features You Will Find Useful
Php 5.4: New Language Features You Will Find UsefulPhp 5.4: New Language Features You Will Find Useful
Php 5.4: New Language Features You Will Find Useful
 
Object-oriented Basics
Object-oriented BasicsObject-oriented Basics
Object-oriented Basics
 
A topology of memory leaks on the JVM
A topology of memory leaks on the JVMA topology of memory leaks on the JVM
A topology of memory leaks on the JVM
 

More from Charles Nutter

The Year of JRuby - RubyC 2018
The Year of JRuby - RubyC 2018The Year of JRuby - RubyC 2018
The Year of JRuby - RubyC 2018Charles Nutter
 
Open Source Software Needs You!
Open Source Software Needs You!Open Source Software Needs You!
Open Source Software Needs You!Charles Nutter
 
InvokeBinder: Fluent Programming for Method Handles
InvokeBinder: Fluent Programming for Method HandlesInvokeBinder: Fluent Programming for Method Handles
InvokeBinder: Fluent Programming for Method HandlesCharles Nutter
 
Over 9000: JRuby in 2015
Over 9000: JRuby in 2015Over 9000: JRuby in 2015
Over 9000: JRuby in 2015Charles Nutter
 
Doing Open Source the Right Way
Doing Open Source the Right WayDoing Open Source the Right Way
Doing Open Source the Right WayCharles Nutter
 
Bringing Concurrency to Ruby - RubyConf India 2014
Bringing Concurrency to Ruby - RubyConf India 2014Bringing Concurrency to Ruby - RubyConf India 2014
Bringing Concurrency to Ruby - RubyConf India 2014Charles Nutter
 
Beyond JVM - YOW! Brisbane 2013
Beyond JVM - YOW! Brisbane 2013Beyond JVM - YOW! Brisbane 2013
Beyond JVM - YOW! Brisbane 2013Charles Nutter
 
The Future of JRuby - Baruco 2013
The Future of JRuby - Baruco 2013The Future of JRuby - Baruco 2013
The Future of JRuby - Baruco 2013Charles Nutter
 
High Performance Ruby - E4E Conference 2013
High Performance Ruby - E4E Conference 2013High Performance Ruby - E4E Conference 2013
High Performance Ruby - E4E Conference 2013Charles Nutter
 
Invokedynamic in 45 Minutes
Invokedynamic in 45 MinutesInvokedynamic in 45 Minutes
Invokedynamic in 45 MinutesCharles Nutter
 
Invokedynamic: Tales from the Trenches
Invokedynamic: Tales from the TrenchesInvokedynamic: Tales from the Trenches
Invokedynamic: Tales from the TrenchesCharles Nutter
 
Why JRuby? - RubyConf 2012
Why JRuby? - RubyConf 2012Why JRuby? - RubyConf 2012
Why JRuby? - RubyConf 2012Charles Nutter
 
Aloha RubyConf 2012 - JRuby
Aloha RubyConf 2012 - JRubyAloha RubyConf 2012 - JRuby
Aloha RubyConf 2012 - JRubyCharles Nutter
 
High Performance Ruby - Golden Gate RubyConf 2012
High Performance Ruby - Golden Gate RubyConf 2012High Performance Ruby - Golden Gate RubyConf 2012
High Performance Ruby - Golden Gate RubyConf 2012Charles Nutter
 
InvokeDynamic - You Ain't Seen Nothin Yet
InvokeDynamic - You Ain't Seen Nothin YetInvokeDynamic - You Ain't Seen Nothin Yet
InvokeDynamic - You Ain't Seen Nothin YetCharles Nutter
 
Building Languages for the JVM - StarTechConf 2011
Building Languages for the JVM - StarTechConf 2011Building Languages for the JVM - StarTechConf 2011
Building Languages for the JVM - StarTechConf 2011Charles Nutter
 
JRuby: What's Different (RORO Melbourne October 2011)
JRuby: What's Different (RORO Melbourne October 2011)JRuby: What's Different (RORO Melbourne October 2011)
JRuby: What's Different (RORO Melbourne October 2011)Charles Nutter
 

More from Charles Nutter (19)

The Year of JRuby - RubyC 2018
The Year of JRuby - RubyC 2018The Year of JRuby - RubyC 2018
The Year of JRuby - RubyC 2018
 
Open Source Software Needs You!
Open Source Software Needs You!Open Source Software Needs You!
Open Source Software Needs You!
 
InvokeBinder: Fluent Programming for Method Handles
InvokeBinder: Fluent Programming for Method HandlesInvokeBinder: Fluent Programming for Method Handles
InvokeBinder: Fluent Programming for Method Handles
 
Over 9000: JRuby in 2015
Over 9000: JRuby in 2015Over 9000: JRuby in 2015
Over 9000: JRuby in 2015
 
Doing Open Source the Right Way
Doing Open Source the Right WayDoing Open Source the Right Way
Doing Open Source the Right Way
 
JRuby: The Hard Parts
JRuby: The Hard PartsJRuby: The Hard Parts
JRuby: The Hard Parts
 
Bringing Concurrency to Ruby - RubyConf India 2014
Bringing Concurrency to Ruby - RubyConf India 2014Bringing Concurrency to Ruby - RubyConf India 2014
Bringing Concurrency to Ruby - RubyConf India 2014
 
Beyond JVM - YOW! Brisbane 2013
Beyond JVM - YOW! Brisbane 2013Beyond JVM - YOW! Brisbane 2013
Beyond JVM - YOW! Brisbane 2013
 
The Future of JRuby - Baruco 2013
The Future of JRuby - Baruco 2013The Future of JRuby - Baruco 2013
The Future of JRuby - Baruco 2013
 
High Performance Ruby - E4E Conference 2013
High Performance Ruby - E4E Conference 2013High Performance Ruby - E4E Conference 2013
High Performance Ruby - E4E Conference 2013
 
Invokedynamic in 45 Minutes
Invokedynamic in 45 MinutesInvokedynamic in 45 Minutes
Invokedynamic in 45 Minutes
 
Invokedynamic: Tales from the Trenches
Invokedynamic: Tales from the TrenchesInvokedynamic: Tales from the Trenches
Invokedynamic: Tales from the Trenches
 
Why JRuby? - RubyConf 2012
Why JRuby? - RubyConf 2012Why JRuby? - RubyConf 2012
Why JRuby? - RubyConf 2012
 
Aloha RubyConf 2012 - JRuby
Aloha RubyConf 2012 - JRubyAloha RubyConf 2012 - JRuby
Aloha RubyConf 2012 - JRuby
 
High Performance Ruby - Golden Gate RubyConf 2012
High Performance Ruby - Golden Gate RubyConf 2012High Performance Ruby - Golden Gate RubyConf 2012
High Performance Ruby - Golden Gate RubyConf 2012
 
Euruko 2012 - JRuby
Euruko 2012 - JRubyEuruko 2012 - JRuby
Euruko 2012 - JRuby
 
InvokeDynamic - You Ain't Seen Nothin Yet
InvokeDynamic - You Ain't Seen Nothin YetInvokeDynamic - You Ain't Seen Nothin Yet
InvokeDynamic - You Ain't Seen Nothin Yet
 
Building Languages for the JVM - StarTechConf 2011
Building Languages for the JVM - StarTechConf 2011Building Languages for the JVM - StarTechConf 2011
Building Languages for the JVM - StarTechConf 2011
 
JRuby: What's Different (RORO Melbourne October 2011)
JRuby: What's Different (RORO Melbourne October 2011)JRuby: What's Different (RORO Melbourne October 2011)
JRuby: What's Different (RORO Melbourne October 2011)
 

Recently uploaded

[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
Dynamical Context introduction word sensibility orientation
Dynamical Context introduction word sensibility orientationDynamical Context introduction word sensibility orientation
Dynamical Context introduction word sensibility orientationBuild Intuit
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...Jeffrey Haguewood
 
Laying the Data Foundations for Artificial Intelligence!
Laying the Data Foundations for Artificial Intelligence!Laying the Data Foundations for Artificial Intelligence!
Laying the Data Foundations for Artificial Intelligence!Memoori
 
Kuma Meshes Part I - The basics - A tutorial
Kuma Meshes Part I - The basics - A tutorialKuma Meshes Part I - The basics - A tutorial
Kuma Meshes Part I - The basics - A tutorialJoão Esperancinha
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observabilityitnewsafrica
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024TopCSSGallery
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
Why Agile? - A handbook behind Agile Evolution
Why Agile? - A handbook behind Agile EvolutionWhy Agile? - A handbook behind Agile Evolution
Why Agile? - A handbook behind Agile EvolutionDEEPRAJ PATHAK
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxGenerative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxfnnc6jmgwh
 
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...itnewsafrica
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Nikki Chapple
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
Digital Tools & AI in Career Development
Digital Tools & AI in Career DevelopmentDigital Tools & AI in Career Development
Digital Tools & AI in Career DevelopmentMahmoud Rabie
 
React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...Karmanjay Verma
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integrationmarketing932765
 

Recently uploaded (20)

[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
Dynamical Context introduction word sensibility orientation
Dynamical Context introduction word sensibility orientationDynamical Context introduction word sensibility orientation
Dynamical Context introduction word sensibility orientation
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
Email Marketing Automation for Bonterra Impact Management (fka Social Solutio...
 
Laying the Data Foundations for Artificial Intelligence!
Laying the Data Foundations for Artificial Intelligence!Laying the Data Foundations for Artificial Intelligence!
Laying the Data Foundations for Artificial Intelligence!
 
Kuma Meshes Part I - The basics - A tutorial
Kuma Meshes Part I - The basics - A tutorialKuma Meshes Part I - The basics - A tutorial
Kuma Meshes Part I - The basics - A tutorial
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
Why Agile? - A handbook behind Agile Evolution
Why Agile? - A handbook behind Agile EvolutionWhy Agile? - A handbook behind Agile Evolution
Why Agile? - A handbook behind Agile Evolution
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxGenerative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
 
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...Abdul Kader Baba- Managing Cybersecurity Risks  and Compliance Requirements i...
Abdul Kader Baba- Managing Cybersecurity Risks and Compliance Requirements i...
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
Digital Tools & AI in Career Development
Digital Tools & AI in Career DevelopmentDigital Tools & AI in Career Development
Digital Tools & AI in Career Development
 
React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
 

JRuby and Invokedynamic - Japan JUG 2015