rémi forax - lrde.epita.fr · pdf filerémi forax université paris ......
TRANSCRIPT
![Page 1: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/1.jpg)
JSR 292 / PHP.rebootRémi Forax
Université Paris-Est Marne-la-Vallée
![Page 2: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/2.jpg)
Classic JVM
bytecode
JITinterpreter
native code
platform/OS
VM
compile
interprets
callscalls
deopts/fallbackgenerates
hot codetriggers
![Page 3: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/3.jpg)
Dynamic Language Runtime
bytecode
JITinterpreter
native code
VM
generates
interprets
deopts/fallbacksgenerates
hot codetrigger
interpreter runtime compiler
runtime library
calls
calls
LanguageRuntime
calls
![Page 4: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/4.jpg)
Pain features of dynamic languages
no declared type
operators are overloaded
overflow
add/remove fields
add/remove/replace methods
monkey patching
![Page 5: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/5.jpg)
real dynamic code is uncommon
>> type inference & typechecking
monkey patching & overflow are rare
>> bailout guard + deoptimization
operator overload & duck typing
>> inlining cache/tree
Image © Thomas Hellberg - flickr
![Page 6: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/6.jpg)
Hotspot JVM >> Multi-Language VM
OpenJDK - Da Vinci Project
setup in 2007
First step
Support dynamically typed languageon the Java Platform (JSR 292)
Next steps
Tailcalls, coroutine, continuation, stack inspection, interface extensions, immediate wrapper type, etc.
![Page 7: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/7.jpg)
Overview of JSR 292
Uncouple call site and callee
invokedynamic
method handle
+ API for creating/managing method handles
int plusI(int i, int i2) { ...}
invokedynamic + (ILObject;)LObject;
iconst 1aload 1
method handles
float plusF(float f, float f2) { ...}
1 + v
![Page 8: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/8.jpg)
Method Handle
Single type: java.dyn.MethodHandle
Type safe function pointer
embodies its type (MethodType)
Callable with a polymorphic signature method
(int)mh.invokeExact(2, 3.0)
Image © Carl Smith - flickr
![Page 9: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/9.jpg)
Managing method handles
Create a Method Handleconstant: String#charAt(int)
lookup: MHs.lookup().findVirtual(String.class, "charAt", methodType(char.class, int.class))
Core combinatorsasType(), bindTo(), asCollector()/asSpreader(), invokeWithArguments()
Other combinatorsguardWithTest(), dropArguments/insertArguments(), filterArguments()/filterReturnValue(),explicitCastArguments(), etc.
![Page 10: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/10.jpg)
Invokedynamic
First call
a bootstrap method does the linkageEach invokedynamic has its own BSM
Creates a reified CallSiteCallSite contains the target method handle
Next calls
Use the target method handle
CallSite.setTarget()
Ask a relinkingImage © Samantha Decker - flickr
![Page 11: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/11.jpg)
How to implement an inlining cache ?
invokedynamic [#bsm] +(ILObject;)LObject;
iconst 1aload 1
CallSite bsm(Lookup lookup, String name, MethodType type) { CallSite cs = new CallSite(type); MethodHandle mh = #fallback(CallSite, Object[]); mh = MHs.insertArguments(mh, 0, cs); mh = MHs.collectArguments(mh, type.pCount(), type.generic()); mh = Mhs.convertArguments(mh, type); cs.setTarget(mh) ; return cs ;}
Object fallback(CallSite cs, Object[] args) { ... }
The BSM installs a fallback method
creates
![Page 12: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/12.jpg)
How to implement an inlining cache ?
invokedynamic [#bsm] +(ILObject;)LObject;
iconst 1aload 1
Object fallback(CallSite cs, Object[] args) { MethodType type = type(cs, args); MH mh = findMH(type, cs.type()); MH test = findTest(type, mh.type()); MH mh = MHs.guardWithTest(test, mh, cs.getTarget()); cs.setTarget(mh); return mh.invokeWithArguments(args);}
insertconvert collect
The fallback prepends a guard
@CallSite
![Page 13: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/13.jpg)
How to implement an inlining cache ?
int plus(int i1, int i2) { return i1 + i2 ;}
invokedynamic [#bsm] +(ILObject;)LObject;
iconst 1aload 1
Object fallback(CallSite cs, Object[] args) { ...}
guardWithTest
boolean test(Class c, Object o, Object o2) { return c.isInstance(o2);}
convert
insertInteger.class
insertconvert collect
The tree is stable until a new class is discovered
test
target
fallback
![Page 14: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/14.jpg)
![Page 15: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/15.jpg)
JSR 292
More than just invokedynamic/MH
ClassValue, Switcher(invalidation)
Main drawback
Path from pre-jsr292 to post-jsr292 requires a full rewrite of the runtime
Image © Luke Andrew Scowen - flickr
![Page 16: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/16.jpg)
PHP.reboot
![Page 17: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/17.jpg)
In few words ...
Secure!
No eval, no magic quote
DSLs for XML, JSON, SQL, Xpath, Xquery, etc.
Sanitize depending on the context
Dynamically typed with gradual type system
Interpreter, ahead of time & runtime compilers
Compatible with 1.6/1.7 VMs
![Page 18: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/18.jpg)
Toolchain
Tatoo – parser generator (LALR)Generate ASTs from grammars, change at runtime
Keyword are local by default
Evaluate AST asap (fast reduce)
JSR 292 + lightweight loadingShare runtime logic between interpreter and bytecode
Lambda/closure for free
ASM – fast bytecode generationPartial supports of JDK7 classfile format
Image © sharps - flickr
![Page 19: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/19.jpg)
PHP.reboot runtime
First interpret then compileupdate already existing call sites
Compile hot method and loops bodyinterpreter profiles interpreted code
In loops:speculatively use profiled runtime types
prove with a simple forward typechecker
specialize functions
generate same code as javacRevert and use invokedynamic if variable is really dynamic
record untaken paths to generate escape exit
profile field use/alloc-site to generate adhoc object
Image © Joe Penniston - flickr
![Page 20: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/20.jpg)
A simple dynamic example
for(i = 0; i < 350; i = i + 1) { if (i == 100) { i = 102.0 }} i is an integer
then a real !!
Image © Peteris B. - flickr
![Page 21: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/21.jpg)
Type inference without escape
trace(LEvalEnv;Ljava/lang/Object;LVar;)Zl0: aload 1 sipush 350 invokedynamic [#op] > (LObject;I)Z ifne l1 aload 1 bipush 100 invokestatic Integer.valueOf(I)LInteger; // boxing invokestatic RT.ne(LObject;LObject;)Z ifne l2 ldc 102.0 invokestatic Double.valueOf(D)LDouble; // boxing astore 1l2: aload 1 iconst_1 invokedynamic [#op] + (LObject;I)LObject; astore 1 goto l0l1: aload 2 // post instruction, update interpreter variables aload 1 invokevirtual Var.setValue (LObject;)V ...
![Page 22: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/22.jpg)
Optimization with escape trace
trace(LEvalEnv;ILMethodHandle;LVar;)Zl0: iload 1 sipush 350 if_icmpgt l1 // no loop peeling ! iload 1 sipush 100 if_icmpne l2 aload 2 aload 0 iload 1 invokevirtual invoke(LEvalEnv;I)V iconst_0 ireturn // return false, trace escape !l2: iload 1 iconst_1 iadd istore 1 goto l0l1: ... // post instruction, update interpreter variables
![Page 23: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/23.jpg)
Bailout to interpreter
Need to restore:
Interpreter's stack of valuesTypechecker prepares a blank stack + association between parameters position and stack position
Interpreter's call stack (walk on the AST)
Solution >>Adhoc evaluator that completes the iteration
Loop may be re-optimized later
Image ©Image © Olivier Hammond - flickr Olivier Hammond - flickr
![Page 24: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/24.jpg)
Optimization after escape trace
trace(LEvalEnv;DLVar;)Vl0: dload 1 sipush 350 i2d // no constant propagation ! dcmpg ifge l1 dload 1 bipush 100 i2d dcmpg ifne l2 ldc 102.0 dstore 1l2: dload 1 iconst_1 i2d dadd dstore 1 goto l0l1: ... // post instruction, update interpreter variables
![Page 25: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/25.jpg)
And with function calls ?
function fibo(a) { if (a < 2) return 1 return fibo(a - 1) + fibo(a - 2)}
i = 0while (i < 200) { fibo(i % 7) i = i + 1}
The runtime
specializes
functions in loop
![Page 26: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/26.jpg)
Fibo is called often
fibo(LEvalEnv;LObject;)LObject; aload 1 iconst_2 invokedynamic [#op] > (LObject;I)Z ifne l0 iconst_1 invokestatic Integer.valueOf(I)LInteger; // boxing areturnl0: aload 0 aload 1 iconst_1 invokedynamic [#op] - (LObject;I)LObject; invokedynamic [#call] fibo(LEvalEnv;LObject;)LObject; aload 0 aload 1 iconst_2 invokedynamic [#op] - (LObject;I)LObject; invokedynamic [#call] fibo(LEvalEnv;LObject;)LObject; invokedynamic [#op] + (LObject;LObject;)LObject; areturn
![Page 27: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/27.jpg)
'while' is traced/compiled
trace(LEvalEnv;ILVar;)Zl0: iload 1 sipush 200 if_icmpge l1 aload 0 aload 1 bipush 7 irem invokedynamic [#call] fibo(LEvalEnv;I)LObject; // fibo is specialized ! pop iload 1 iconst_1 iadd istore 1 goto l0l1: aload 2 // post instruction, update interpreter variables aload 1 invokestatic Integer.valueOf(I)LInteger; // boxing invokevirtual Var.setValue(LObject;)V iconst_1 ireturn
![Page 28: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/28.jpg)
Specialized Fibo
fibo(LEvalEnv;I)LObject; iload 1 iconst_2 if_icmpge l0 iconst_1 invokestatic Integer.valueOf(I)LInteger; // boxing areturnl0: aload 0 iload 1 iconst_1 isub invokedynamic [#call] fibo(LEvalEnv;I)LObject; aload 0 iload 1 iconst_2 isub invokedynamic [#call] fibo(LEvalEnv;I)LObject; invokedynamic [#op] + (LObject;LObject;)LObject; areturn
![Page 29: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/29.jpg)
Overflow ?
Operators can overflow to another type
Break typechecking but ...implemented in Ruby, Python, Javascript (Groovy??)
>> Store stack in locals, reconstruct when bailout
Image ©Image © Jenny Downing - flickr Jenny Downing - flickr
![Page 30: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/30.jpg)
Render Mandelbrot, 1024x1024 tile, 50 iterations
Image © Jerry Charlotte - flickr
![Page 31: Rémi Forax - lrde.epita.fr · PDF fileRémi Forax Université Paris ... Object fallback(CallSite cs, Object[] args) { ... } The BSM installs a fallback method creates. ... ASM –](https://reader033.vdocuments.net/reader033/viewer/2022042707/5a710de67f8b9aac538c7ebd/html5/thumbnails/31.jpg)
Perspectives
Background compilation
IndyDroid (JSR 292 on Android)
Lambda (JSR 335)
Image © Martin Chen - flickr