GraalVM
Truffle PHP
Oracle Code One 2018 in
2019/1/12 LINE Fukuoka
•
• LINE Fukuoka
• @kis
• Oracle Code One
Today’s talk
• About the Oracle Code One
• About the GraalVM
• GraalVM in practice
About the Oracle Code One
• Former as known as JavaOne
• Java
• Sun Francisco Moscone Center West
• Beck
• Marriortt
•
Marriott
• Marriott Westin
• One Job Enough
•
( )
•
• → → →
• 2
• JDK11 with JShell(120 )
•
(45 )
https://qiita.com/nowokay/items/80e8ccd50f6749846dd6
GraalVM
• Oracle JVM
• http://www.graalvm.org/
• CE
EE
• Graal + Truffle
• Polyglot
• JS, Python, Ruby, …
•
GraalVM and MicroProfile: A Polyglot Microservices Solution [DEV6016]
Graal
• Java JIT
• C2
• C2 C++
•
Client(C1) Server(C2)
Compiler Interface
HotSpot
Graal
JVMCI
HotSpot
Written in Java
Truffle and Sulong
• Truffle
• AST
• AST GC
• LLVM
• Sulong
• LLVM bitcode -> Truffle AST
• LLVM OK
• Rust, C…
Polyglot
• Truffle
• JavaScript(Graal JS), Ruby(TruffleRuby), Python, R…
•
• js --inspect hoge.js
•
• Oracle MySQL SQL JavaScript
• Java
• SubstrateVM
Instant Startup and Low Footprint for Java [DEV5705]
GraalVM in Oracle Code One 2018
• graal 10
• Vision and Roadmap
• GraalVM JavaScript
vue ( )
GraalVM
• JVM
• Polyglot
• LLVM
•
• See also
• Ten Things You Can Do with GraalVM - BYOL [HOL5576]
• Instant Startup and Low Footprint for Java [DEV5705]
VM
• JIT
• Also available with JDK11
java -XX:+UnlockExperimentalVMOptions
-XX:+EnableJVMCI
-XX:+UseJVMXCICompiler Hello
• Oracle Code One
•
•
0
2
4
6
8
10
12
14
16
18
( )
JDK8 JDK11 JDK11+Graal GraalVM
https://github.com/kishida/smallpt4j/blob/original/src/main/java/naoki/smallpt/SmallPT.java
•
• Graal
• Graal
• JIT Graal
2172 5376 1 org.graalvm.compiler.lir.amd64.AMD64Move::canMoveConst2Stack (81 bytes)
2172 5377 1 org.graalvm.compiler.core.amd64.AMD64NodeMatchRules$1::<init> (50 bytes)
2172 5385 1 org.graalvm.compiler.core.common.type.ObjectStamp::getLIRKind (7 bytes)
2172 5386 1 org.graalvm.compiler.core.amd64.AMD64ArithmeticLIRGenerator::emitAdd (232 bytes)
2174 5387 1 org.graalvm.compiler.lir.gen.LIRGenerator::emitJavaConstant (16 bytes)
2174 5378 1 org.graalvm.compiler.core.amd64.AMD64NodeMatchRules$1::evaluate (181 bytes)
2175 5388 1 org.graalvm.compiler.core.common.type.FloatStamp::getLIRKind (11 bytes)
2175 5392 3 org.graalvm.collections.EconomicMapImpl$1::iterator (9 bytes)
2175 5393 3 org.graalvm.collections.EconomicMapImpl$1$1::<init> (15 bytes)
Polyglot
• JavaScript Java
$ js --jvm --polyglot
> var BigInteger = Java.type(‘BigInteger’)
> BigInteger.valueOf(123).pow(10).toString()
• JavaScript Ruby
> Interop.eval(‘ruby’, ‘print “hello”’)
LLVM
• Rust
$ rustc --emit=llvm-bc main.rs
$ lli --lib $(rustc --print sysroot)/lib/libstd-* main.bc
•
$ native-image Hello
$ ./Hello
•
• 46 (JDK11 11 , GraalVM 17 )
• ->10MB
• GraalVM 1.0 RC1
ImageIO
graaldemo $ time java Hello
Hello!
real 0m0.103s
user 0m0.068s
sys 0m0.025s
graaldemo $ time ./hello
Hello!
real 0m0.013s
user 0m0.005s
sys 0m0.006s
Truffle
• Truffle
• AST
• AST GC
•
• Graal JIT SDK
• AST Graal JIT
• Graal JIT
• Object ( )
• ( Java )
Graal Truffle
• Graal Java JIT
• Java AST
• AST Java
• Java Graal
• Graal SDK
•
•
→ Truffle
•
• Node
• Frame
• CallTarget
• TruffleObject
• CompilationDerective Graal
http://d.hatena.ne.jp/nowokay/20190101#1546291326
PHP
•
• + - < > .( )
•
•
• if
• echo
https://github.com/kishida/phpparser
<?php
function fib($n) {
if ($n < 2) {
return $n;
}
return fib($n - 1) + fib($n - 2);
}
echo "fib:".fib(31);
echo "¥n";
<?php function fib($n) {
if ($n < 2) {
return $n;
}
return fib($n - 1) + fib($n - 2);
}
$start = microtime(1);
echo "fib:".fib(31);
echo "¥n";
echo "time:".(microtime(1) - $start);
echo "¥n";
fib(31);fib(31);fib(31);fib(31);fib(31);
$start = microtime(1);
echo "fib:".fib(31);
echo "¥n";
echo "time:".(microtime(1) - $start);
echo "¥n";
• (interpreter) on JDK 11
• Truffle JDK 11
• Truffle GraalVM CE
• Truffle GraalVM CE
• Truffle GraalVM EE
• Truffle GraalVM EE
• PHP 5.6
• PHP 7.3
(JIT )
• PHP 7.3 PHP5.6 3
• PHP7.3 7
• Truffle+GraalVM CE PHP7.3
• Truffle+GraalVM EE PHP7.3 2
• GraalVM CE
PHP7.3 2
• GraalVM EE
PHP7.3 4
• JIT
•
•
• EE PHP7.3
• CE PHP7.3
• PHP
•
•
• EE CE
<?php
function fib($n) {
if ($n < 2) {
return $n;
}
return fib($n - 1) + fib($n - 2);
}
echo "fib:".fib(31);
echo "¥n";
• Real User CPU
• JVM User
•
CPU
• GraalVM Real User
• Graal
CPU
• PHP PHP3 PHP4 PHP5 PHP7
(PHP6 )
•
PHP7
•
• GraalVM
• Truffle

GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話

  • 1.
    GraalVM Truffle PHP Oracle CodeOne 2018 in 2019/1/12 LINE Fukuoka
  • 2.
    • • LINE Fukuoka •@kis • Oracle Code One
  • 3.
    Today’s talk • Aboutthe Oracle Code One • About the GraalVM • GraalVM in practice
  • 4.
    About the OracleCode One • Former as known as JavaOne • Java • Sun Francisco Moscone Center West • Beck
  • 5.
  • 6.
    Marriott • Marriott Westin •One Job Enough • ( )
  • 7.
  • 8.
    • 2 • JDK11with JShell(120 ) • (45 ) https://qiita.com/nowokay/items/80e8ccd50f6749846dd6
  • 9.
    GraalVM • Oracle JVM •http://www.graalvm.org/ • CE EE • Graal + Truffle • Polyglot • JS, Python, Ruby, … •
  • 10.
    GraalVM and MicroProfile:A Polyglot Microservices Solution [DEV6016]
  • 11.
    Graal • Java JIT •C2 • C2 C++ • Client(C1) Server(C2) Compiler Interface HotSpot Graal JVMCI HotSpot Written in Java
  • 12.
    Truffle and Sulong •Truffle • AST • AST GC • LLVM • Sulong • LLVM bitcode -> Truffle AST • LLVM OK • Rust, C…
  • 13.
    Polyglot • Truffle • JavaScript(GraalJS), Ruby(TruffleRuby), Python, R… • • js --inspect hoge.js • • Oracle MySQL SQL JavaScript
  • 14.
    • Java • SubstrateVM InstantStartup and Low Footprint for Java [DEV5705]
  • 15.
    GraalVM in OracleCode One 2018 • graal 10 • Vision and Roadmap • GraalVM JavaScript vue ( )
  • 16.
    GraalVM • JVM • Polyglot •LLVM • • See also • Ten Things You Can Do with GraalVM - BYOL [HOL5576] • Instant Startup and Low Footprint for Java [DEV5705]
  • 17.
    VM • JIT • Alsoavailable with JDK11 java -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -XX:+UseJVMXCICompiler Hello • Oracle Code One
  • 18.
    • • 0 2 4 6 8 10 12 14 16 18 ( ) JDK8 JDK11JDK11+Graal GraalVM https://github.com/kishida/smallpt4j/blob/original/src/main/java/naoki/smallpt/SmallPT.java
  • 19.
    • • Graal • Graal •JIT Graal 2172 5376 1 org.graalvm.compiler.lir.amd64.AMD64Move::canMoveConst2Stack (81 bytes) 2172 5377 1 org.graalvm.compiler.core.amd64.AMD64NodeMatchRules$1::<init> (50 bytes) 2172 5385 1 org.graalvm.compiler.core.common.type.ObjectStamp::getLIRKind (7 bytes) 2172 5386 1 org.graalvm.compiler.core.amd64.AMD64ArithmeticLIRGenerator::emitAdd (232 bytes) 2174 5387 1 org.graalvm.compiler.lir.gen.LIRGenerator::emitJavaConstant (16 bytes) 2174 5378 1 org.graalvm.compiler.core.amd64.AMD64NodeMatchRules$1::evaluate (181 bytes) 2175 5388 1 org.graalvm.compiler.core.common.type.FloatStamp::getLIRKind (11 bytes) 2175 5392 3 org.graalvm.collections.EconomicMapImpl$1::iterator (9 bytes) 2175 5393 3 org.graalvm.collections.EconomicMapImpl$1$1::<init> (15 bytes)
  • 20.
    Polyglot • JavaScript Java $js --jvm --polyglot > var BigInteger = Java.type(‘BigInteger’) > BigInteger.valueOf(123).pow(10).toString() • JavaScript Ruby > Interop.eval(‘ruby’, ‘print “hello”’)
  • 21.
    LLVM • Rust $ rustc--emit=llvm-bc main.rs $ lli --lib $(rustc --print sysroot)/lib/libstd-* main.bc
  • 22.
    • $ native-image Hello $./Hello • • 46 (JDK11 11 , GraalVM 17 ) • ->10MB • GraalVM 1.0 RC1 ImageIO graaldemo $ time java Hello Hello! real 0m0.103s user 0m0.068s sys 0m0.025s graaldemo $ time ./hello Hello! real 0m0.013s user 0m0.005s sys 0m0.006s
  • 23.
    Truffle • Truffle • AST •AST GC • • Graal JIT SDK • AST Graal JIT • Graal JIT • Object ( ) • ( Java )
  • 24.
    Graal Truffle • GraalJava JIT • Java AST • AST Java • Java Graal • Graal SDK • • → Truffle •
  • 25.
    • Node • Frame •CallTarget • TruffleObject • CompilationDerective Graal http://d.hatena.ne.jp/nowokay/20190101#1546291326
  • 26.
    PHP • • + -< > .( ) • • • if • echo https://github.com/kishida/phpparser
  • 27.
    <?php function fib($n) { if($n < 2) { return $n; } return fib($n - 1) + fib($n - 2); } echo "fib:".fib(31); echo "¥n";
  • 28.
    <?php function fib($n){ if ($n < 2) { return $n; } return fib($n - 1) + fib($n - 2); } $start = microtime(1); echo "fib:".fib(31); echo "¥n"; echo "time:".(microtime(1) - $start); echo "¥n"; fib(31);fib(31);fib(31);fib(31);fib(31); $start = microtime(1); echo "fib:".fib(31); echo "¥n"; echo "time:".(microtime(1) - $start); echo "¥n";
  • 29.
    • (interpreter) onJDK 11 • Truffle JDK 11 • Truffle GraalVM CE • Truffle GraalVM CE • Truffle GraalVM EE • Truffle GraalVM EE • PHP 5.6 • PHP 7.3
  • 30.
    (JIT ) • PHP7.3 PHP5.6 3 • PHP7.3 7 • Truffle+GraalVM CE PHP7.3 • Truffle+GraalVM EE PHP7.3 2 • GraalVM CE PHP7.3 2 • GraalVM EE PHP7.3 4
  • 31.
    • JIT • • • EEPHP7.3 • CE PHP7.3
  • 32.
    • PHP • • • EECE <?php function fib($n) { if ($n < 2) { return $n; } return fib($n - 1) + fib($n - 2); } echo "fib:".fib(31); echo "¥n";
  • 33.
    • Real UserCPU • JVM User • CPU • GraalVM Real User • Graal CPU
  • 34.
    • PHP PHP3PHP4 PHP5 PHP7 (PHP6 ) • PHP7 •
  • 35.