Polyglot on the JVM with Graal (Japanese)

Preview:

Citation preview

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

PolyglotontheJVMwithGraal

Akihiro Nishikawa

May 20, 2017JJUGCCC2017Spring

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

SafeHarborStatementThefollowingisintendedtooutlineourgeneralproductdirection.Itisintendedforinformationpurposesonly,andmaynotbeincorporatedintoanycontract.Itisnotacommitmenttodeliveranymaterial,code,orfunctionality,andshouldnotberelieduponinmakingpurchasingdecisions.Thedevelopment,release,andtimingofanyfeaturesorfunctionalitydescribedforOracle’sproductsremainsatthesolediscretionofOracle.

2

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

ProgramAgenda

3

What’sGraal?What’sGraal VM?

PolyglotinGraal VM

Howtouse

Appendix

1

2

3

4

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

What’sGraal?What’sGraal VM?

4

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

GraalとGraal VM

• speculative optimizationを得意とする、Javaで記述されたJITコンパイラ– HotSpotベース–種々の言語の実行パフォーマンス向上を目指して設計– JVMCI (Java-LevelJVMCompilerInterface、 JEP243)準拠– Java 9には実験的機能として搭載

5

Graal

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

GraalとGraal VM

• GraalやTruffle、その他の言語がバンドルされたJVM

6

Graal VM

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 7

GraalとGraal VM

C++

Java

HotSpot

Compiler Interface

Client Server

HotSpot

JVMCI

Graal

HotSpotVM Graal VM

Compiler Interface

Client

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

PolyglotinGraal VM

8

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

TheOneVMConceptHighperformancepolyglotvirtualmachine

9

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 10

TheRubyLogoisCopyright(c)2006,YukihiroMatsumoto.ItislicensedunderthetermsoftheCreativeCommonsAttribution-ShareAlike 2.5agreementJSLogoCopyright(c)2011ChristopherWilliams<chris@iterativedesigns.com>,MITlicence

YoucandistributetheRlogounderthetermsoftheCreativeCommonsAttribution-ShareAlike 4.0Internationallicense(CC-BY-SA4.0)or(atyouroption)theGNUGeneralPublicLicenseversion2(GPL-2).

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Impl Impl Impl Impl

11

VM VM VM VM

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

VM

Impl Impl Impl Impl

12

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

• JavaScript– ECMAScript2016のスコアはV8より良好–パフォーマンスもV8と同等– node.jsのフルサポート

• R–統計解析向けのプログラミング言語及びその開発実行環境

13

• Ruby– JRubyのフォーク– 5〜10倍ほど高性能

• C、C++、Fortran– LLVM(Sulong)を使ってNativeLanguageをサポート

GraalVMPolyglot

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 14

GraalVMPolyglot

C

HotSpot

JVMCI

Graal

Truffle

LLVM(Sulong)RRubyJavaScript

Java

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Truffle

• Graalコンパイラと一緒に使うことで、Truffleインタプリタは自動的にJITコンパイルされ、通常のJavaのパフォーマンスを出すことができる

•実行時に自己最適化を実行する抽象構文木(AST)インタープリタを構築するための基本的な基盤ならびにツール(TruffleDSL)を提供

15

シンプルなインタプリタとして言語を実装するためのフレームワーク

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 16

ネイティブモジュールを含めて互換性を担保

Graal.jsのアーキテクチャ

C++JavaScript Java

nodeモジュール(Javaスクリプトのみ)

node標準ライブラリ

V8API Thread pool(libeio)

Event loop(libev)

DNS(c-ares)

crypto(OpenSSL)

Graal.js JavaScriptEngine

AdapterV8APItoGraal.js (viaJNI)

Nativeextensions nodebindings(socket,http,…)

nodeモジュール(Nativeextension)

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

FastR

• Goal:RのためのTruffleスタックのメリットを認識すること– CやC++といったNativeLanguageを使わなくても優れたパフォーマンス–データの重いアプリケーションと並列アプリケーション向けに設計– CRAN/Bioconductorリポジトリのサポート

• GNURの「段階的な改善」ではない– Truffleベースの新しい実行エンジン– GNURの置換エンジンとして設計

•最新のGNURインタプリタよりも高速(2〜10倍)

17

https://github.com/graalvm/fastr

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JavaScriptinGraal VM

18

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

標準への対応

19

ECMAScript2015(ES6)(16298tests/16417tests)

テストが通らなかった大部分はUnicode正規表現

93.4%ECMAScript2016(ES7)累乗演算子やArray.prototype.includes()にも対応

テストが通らなかった部分は、ブロックレベル関数定義や、スプレッド演算子での特殊な条件でのテストなど

99.3%

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| OracleConfidential– Internal

Octaneベンチマークの結果

0

0.2

0.4

0.6

0.8

1

1.2

1.4

V8(5.4.500.6) Graal.js

20

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

RubyinGraal VM

21

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

言語とコアライブラリの標準への対応

22

Ruby言語JRubyは 94%

96% RubyコアライブラリJRubyは 95%

99%

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

ベンチマークの結果

0

5

10

15

20

25

30

35

40

45GraalVMJRuby+invokedynamicRuby

23

Rubyを基準としたパフォーマンスの比較(大きいほど高パフォーマンス)

このテストは、AlocationやBigIntegerのパフォーマンスによって制約を受ける

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

“But,it’seasytooptimizethatkindofcode!”

24

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 25

単純なローカル変数

ベクトル化してない

単純な浮動小数点の計算

基本的なループ

演算子以外使っていない(メソッド呼び出しがない)

数値型もしくはBoolean型しか使っていない

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

“RealRubyismuchmorecomplex!”

26

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 27

ループを使わずにSmalltalkスタイルのブロックを利用

ループの境界条件は単純な値ではなくオブジェクト

インスタンス変数

メソッドに隠れたロジック

配列の利用

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 28

コアライブラリを使って計算中間オブジェクト

別の配列を使って、配列の配列にハッシュをマップし、変換してハッシュに戻す

r,g,bのハッシュとして内部ループのPixcelを表現

ローカル変数を使わず、メソッド呼び出しのみ

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 29

メタプログラミング送信 動的に作成されるシンボル

実際のロジックメソッドの動的メソッド呼び出し

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

ChunkyPNGkernels

0.01

0.1

1

10

100

1000 GraalVMJRuby+invokedynamicRuby

30

Rubyを基準として比較

これらのベンチマークは、GraalVMが完全に最適化

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

PSD.rb kernels

0.1

1

10

100

1000 GraalVM JRuby+invokedynamic Ruby

31

Rubyを基準として比較

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Polyglot

32

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

RESTpublicinternet

RESTprivateintranet

33

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

RESTpublicinternet

34

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

RESTpublicinternet

35

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

HowwedopolyglotinGraal VM

36

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

RubyTruffle::Interop.eval('application/language', source)

value = Truffle::Interop.import(name)

Truffle::Interop.export(name)

37

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JavaScriptInterop.eval('application/language', source)

value = Interop.import(name)

Interop.export(name)

// Returns 20Interop.eval('application/javascript', '14 + 6')

38

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JavaScriptinRuby

puts Truffle::Interop.eval('application/javascript','14 + 6')

39

Thisreturns20

JavaScript Ruby

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JavaScriptinRuby

Truffle::Interop.eval('application/javascript', "function add(a,b) {

return a + b;}Interop.export('add',

add.bind(this));")

add = Truffle::Interop.import('add')

puts add.call(14,2)

40

UsesfunctiondefinedinJavaScriptfromRuby

JavaScript

Ruby

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Ruby

JavaScript

41

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Ruby

JS

42

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Performance

43

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 44

Clamp

ウォームアップ後、秒単位でのIterationをレポート

乱数入力があると最適化が効かない

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Ruby

010000002000000300000040000005000000600000070000008000000900000010000000

GraalVM JRuby+invokedynamic Ruby

Ope

ratio

nsPerSecon

d

45

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 46

JavaScript(V8)JavaScriptに書き換え、 V8と組み合わせてみた

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Ruby+JavaScript(V8)

0

50000

100000

150000

200000

250000

300000

350000

Ruby(justRuby) Ruby(Ruby+JSwithV8)

Ope

ratio

nsPerSecon

d

47

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 48

V8からRhinoへ変更

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JRuby +JavaScript(Rhino)

0

100000

200000

300000

400000

500000

600000

JRuby+indy(justRuby) JRuby+indy(Ruby+JSwithRhino)

Ope

ratio

nsPerSecon

d

49

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 50

Nashornで試す

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

JRuby +JavaScript(Nashorn)

0

100000

200000

300000

400000

500000

600000

JRuby+indy(justRuby) JRuby+indy(Ruby+JSwithRhino)

JRuby+indy(Ruby+JSwithNashorn)

Ope

ratio

nsPerSecon

d

51

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 52

Graal VM

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Ruby+JavaScript(Graal VM)

010000002000000300000040000005000000600000070000008000000900000010000000

GraalVM(justRuby) GraalVM(Ruby+JS) JRuby+invokedynamic Ruby

Ope

ratio

nsPerSecon

d

53

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

010000002000000300000040000005000000600000070000008000000900000010000000

GraalVM(justRuby)

GraalVM(Ruby+JS)

JRuby+indy(justRuby)

JRuby+indy(Ruby+JSwithRhino)

JRuby+indy(Ruby+JS

withNashorn)

Ruby(justRuby)

Ruby(Ruby+JSwith

V8)

Ope

ratio

nsPerSecon

d

54

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

1

10

100

1000

10000

100000

1000000

10000000

GraalVM(justRuby)

GraalVM(Ruby+JS)

JRuby+indy(justRuby)

JRuby+indy(Ruby+JSwithRhino)

JRuby+indy(Ruby+JS

withNashorn)

Ruby(justRuby)

Ruby(Ruby+JSwith

V8)

Ope

ratio

nsPerSecon

d

55

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

HowGraal achievesthis

56

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Hotspot

JIT

57

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Hotspot

JITGraal

Truffle

58

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

BasicsofTruffleandGraal

59

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

BasicConcepts• プログラムの表現を共通化

•意味を失わないようにそのままに

•表現の最適化も共通化

60

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

x + y * z

+

x *

y z

load_local xload_local yload_local zcall *call +

pushq %rbpmovq %rsp, %rbpmovq %rdi, -8(%rbp)movq %rsi, -16(%rbp)movq %rdx, -24(%rbp)movq -16(%rbp), %raxmovl %eax, %edxmovq -24(%rbp), %raximull %edx, %eaxmovq -8(%rbp), %rdxaddl %edx, %eaxpopq %rbpret

61

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

U

U U

U

U I

I I

G

G I

I I

G

G

Node Rewriting for Profiling Feedback

AST InterpreterRewritten Nodes

AST InterpreterUninitialized Nodes

Compilation usingPartial Evaluation

Compiled Code

Node Transitions

S

UI

D

G

Uninitialized Integer

Generic

DoubleString

T.Würthinger,C.Wimmer,A.Wöß,L.Stadler,G.Duboscq,C.Humer,G.Richards,D.Simon,andM.Wolczko.OneVMtorulethemall.InProceedingsofOnward!,2013.

62

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

U

U U

U

U I

I I

G

G I

I I

G

G

Node Rewriting for Profiling Feedback

AST InterpreterRewritten Nodes

AST InterpreterUninitialized Nodes

Compilation usingPartial Evaluation

Compiled Code

Node Transitions

S

UI

D

G

Uninitialized Integer

Generic

DoubleString

T.Würthinger,C.Wimmer,A.Wöß,L.Stadler,G.Duboscq,C.Humer,G.Richards,D.Simon,andM.Wolczko.OneVMtorulethemall.InProceedingsofOnward!,2013.

63

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

U

U U

U

U I

I I

G

G I

I I

G

G

Node Rewriting for Profiling Feedback

AST InterpreterRewritten Nodes

AST InterpreterUninitialized Nodes

Compilation usingPartial Evaluation

Compiled Code

Node Transitions

S

UI

D

G

Uninitialized Integer

Generic

DoubleString

T.Würthinger,C.Wimmer,A.Wöß,L.Stadler,G.Duboscq,C.Humer,G.Richards,D.Simon,andM.Wolczko.OneVMtorulethemall.InProceedingsofOnward!,2013.

64

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

T.Würthinger,C.Wimmer,A.Wöß,L.Stadler,G.Duboscq,C.Humer,G.Richards,D.Simon,andM.Wolczko.OneVMtorulethemall.InProceedingsofOnward!,2013.

I

I I

G

G I

I I

G

G

Deoptimizationto AST Interpreter

D

I D

G

G D

I D

G

G

Node Rewriting to Update Profiling Feedback

Recompilation usingPartial Evaluation

65

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

T.Würthinger,C.Wimmer,A.Wöß,L.Stadler,G.Duboscq,C.Humer,G.Richards,D.Simon,andM.Wolczko.OneVMtorulethemall.InProceedingsofOnward!,2013.

I

I I

G

G I

I I

G

G

Deoptimizationto AST Interpreter

D

I D

G

G D

I D

G

G

Node Rewriting to Update Profiling Feedback

Recompilation usingPartial Evaluation

66

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 67

呼び出していたら…

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 68

高頻度で呼び出している場合…

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 69

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 70

異言語で作成していても

高頻度で呼び出している場合…

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 71

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 72

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Lookingathoweffectivethisis

73

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 74

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 75

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 76

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 77

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 78

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 79

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 80

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

HowtouseGraal VM

81

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

•含まれているもの– JVM(REと DK)– Java– JavaScript– Ruby– R–その他は将来追加予定

•バイナリをtarballとして提供• macOS用もしくはLinux用

82

Graal VM– everythinginonepackagetoday

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 83

Java 8のGraal VMとは異なり、素のJVMを利用Java9では、JVMCIを使って連携

Hotspot

Graal

Truffle

JS others…Ruby

Java

C++

JVMCI(JVMCompilerInterface)

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 84

Java 8のGraal VMとは異なり、素のJVMを利用Java9では、JVMCIを使って連携

Hotspot

Graal

Truffle

JS others…Ruby

Mavenなどを利用

Java 9

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

Appendix

85

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 86

http://www.oracle.com/technetwork/oracle-labs/program-languages“Graal OTN”で検索

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.| 87

https://github.com/graalvm“GitHub GraalVM”で検索

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

AcknowledgementsOracleDaniloAnsaloniStefanAnzingerCosminBascaDanieleBonettaMatthiasBrantnerPetrChalupaJürgenChristLaurentDaynèsGillesDuboscqMartinEntlicherBrandonFishBastianHossbachChristianHumerMickJordanVojinJovanovicPeterKesslerDavidLeopoldsederKevinMenardJakubPodlešákAleksandarProkopecTomRodriguez

Oracle(continued)RolandSchatzChrisSeatonDougSimonŠtěpánŠindelářZbyněkŠlajchrtLukasStadlerCodrutStancuJanŠtolaJaroslavTulachMichaelVanDeVanterAdamWelcChristianWimmerChristianWirthPaulWögererMarioWolczkoAndreasWößThomasWürthinger

JKULinzProf.HanspeterMössenböckBenoitDalozeJosefEislThomasFeichtingerMatthiasGrimmerChristianHäublJosefHaiderChristianHuberStefanMarrManuelRiggerStefanRumzuckerBernhardUrban

Universityof EdinburghChristopheDubachJuanJoséFumero AlfonsoRanjeet SinghToomas Remmelg

LaBRIFloréal Morandat

Universityof California,IrvineProf.MichaelFranzGulfemSavrunYeniceriWeiZhang

Purdue UniversityProf.JanVitekTomasKaliberaPetrMajLeiZhao

T.U.DortmundProf.PeterMarwedelHelenaKotthausIngoKorb

Universityof California,DavisProf.DuncanTempleLangNicholasUlle

Universityof Lugano,SwitzerlandProf.WalterBinderSunHaiyangYudiZheng

OracleInternsBrianBellevilleMiguelGarciaShamsImamAlexeyKaryakinStephenKellAndreasKunftVolkerLantingGeroLeinemannJulianLettnerJoeNashDavidPiorkowskiGregorRichardsRobertSeilbeckRifatShariyar

AlumniErikEcksteinMichaelHauptChristosKotselidisHyunjinLeeDavidLeibsChrisThalingerTillWestmann

Copyright©2017,Oracleand/oritsaffiliates.Allrightsreserved.|

SafeHarborStatementTheprecedingisintendedtooutlineourgeneralproductdirection.Itisintendedforinformationpurposesonly,andmaynotbeincorporatedintoanycontract.Itisnotacommitmenttodeliveranymaterial,code,orfunctionality,andshouldnotberelieduponinmakingpurchasingdecisions.Thedevelopment,release,andtimingofanyfeaturesorfunctionalitydescribedforOracle’sproductsremainsatthesolediscretionofOracle.

89

Recommended