JVM Language Summit 2019(JVMLS) day 2

JVMLSに来ています。2日目。
JVM Language Summit — July 29–31, 2019

初日はこちら
JVM Language Summit 2019(JVMLS) day 1 - きしだのHatena

今日はほぼ1日を通してコンパイラの話でした。
ちなみに、普通はJavaの文脈でコンパイラというとJavaソースコードJavaバイトコードに変換するツールを指すと思いますが、このイベントではJavaバイトコードをネイティブコードに変換する仕組みを指します。

軽いまとめにしようと思ったけど、今日のWorkshopは結構おもしろかったのだけど資料も動画もなく、記憶だけが頼りなので、いまのうちにちゃんと書いておきます。

JIT and AOT in the JVM

JITとAOTの話。
このセッションはすごく面白かったので、ひとつ動画を見るならこれをおすすめします。
f:id:nowokay:20190731190346j:plain

朝ごはんを食べながら聞いてます。 f:id:nowokay:20190731190303j:plain

JITとAOTについて比較しながら話がすすみます。
f:id:nowokay:20190731191918j:plain

JIT結果をキャッシュすることについてJ9だなーと思いながら見てました。
f:id:nowokay:20190731191923j:plain

比較はこんな感じに。
f:id:nowokay:20190731191926j:plain

そしてJITサーバー!!おもしろいことを考えるなーと思いました。
f:id:nowokay:20190731191930j:plain

そこまで含めた結果はこんな感じ。
f:id:nowokay:20190731191935j:plain


JIT and AOT in the JVM with Mark Stoodley

Improving GraalVM Native Image

GraalVMのNative Imageについてのセッション。
初期の想定と実際の利用が違う、という話と、今後どうするかという話でした。 f:id:nowokay:20190731193101j:plain

いつものGraalVMの紹介
f:id:nowokay:20190731193054j:plain

制約として、最適化するところを決めるのに全部のバイトコードを見る必要があるということなどがあります。
f:id:nowokay:20190731193110j:plain

初期の想定ではOracleデータベースに様々な言語を埋め込むために使うということで、コードはひとつのチームで書かれて制約に従うことができるし、プラットフォームも絞れるし、リフレクションやJNIは不要だと考えたということです。なので最初はTruffle推しだったんだな。
f:id:nowokay:20190731194041j:plain

けど実際にはマイクロサービスやコマンドラインで便利だった、と。そうすると初期の想定がくずれたということです。 f:id:nowokay:20190731194049j:plain

対応のひとつとして、LLVMを使うといろんなプラットフォームに対応できてiOSでも動かせる、って話。 f:id:nowokay:20190731193114j:plain


Improving GraalVM Native Image with Christian Wimmer

GraalVM Workshop

GraalVMのネイティブイメージ生成についてのWorkshopでした。
f:id:nowokay:20190731195622j:plain

主な話題は実行時の話ではなくてコンパイルに時間がかかりすぎることでした。コード生成自体ではなく静的解析に時間がかかっているとのこと。
部分コンパイルはどうか、という話には、最適化が呼び出され方で決まるところから難しいということでした。(ここで部分コンパイルはコードの一部が変更されたときにその部分だけコンパイルしなおすことを指すと思います)
同じような理由で、Shared Libraryのようにjarライブラリを事前にコンパイルしておくというのも難しいとのこと。

というのを書きながら、gccのO2、O3みたいに最適化の深さを決めれるようにできないのかなと思った。機会があったら聞いてみよう。

次に、Static Initializerの設定を自動化できないのか、という質問がMark Reinhold氏からありました。
f:id:nowokay:20190731195633j:plain
効率よく実行するためには、Static Initializeをビルド時に行うか実行時に行うかを設定で書く必要があります。ビルド時にできる初期化はビルド時に行うほうが効率がよくなる一方、たとえばstart=currentTimeMillisのような処理をビルド時に行ってビルド時刻を埋め込むのは無意味なので実行時に行う必要があるからです。現在は安全側に振って実行時に行う設定になってますがこれを自動判定できないのか、ということです。
やはり難しそうで、MicronautやQuarkusではフレームワークに設定が埋め込まれているという話をしていました。

あとは、Unsafeは特別対応が必要でたとえばNettyではDirectByteBufferを使っているとか、8バイトのオブジェクトハンドルが4バイトの圧縮ポインタになるのでヒープが圧縮できるとか、AppCDSはあまり助けにならないとか、コンパイルイメージのヒープは読み込み専用にできる(ので効率がよい)とか、マルチクラスローダーはIssueでモジュール構造が助けになるけどみんなモジュール使ってないとかいう話をしていました。
それと、LLVMをバックエンドとして導入することについて、マルチスレッドが弱いという話とGCの問題があって、コンセプト検証の段階だけどiOSで動かすには重要という話。

という感じで、結構おもしろい話が繰り広げられていました。

JIT and AOT in the CLR

CLRでのJITの話。
あまり興味ない人が多かったぽく、空席が結構できてました。
f:id:nowokay:20190731194900j:plain

明確には書いてないけど、前提としてGUIアプリで使うというのがあるっぽい。なので、二回目の起動からはJIT結果を使いまわせるようにしてるという話。
f:id:nowokay:20190731194909j:plain

いろいろ作ってて、いまは3世代目を作ってるということで、それぞれの世代の説明をしていました。
f:id:nowokay:20190731194913j:plain


JIT and AOT in the CLR with Mei-Chin Tsai

Lunch

昨日のごはんが辛かったのだけど、今日は辛くなく、代わりにナスのようなものが辛かった。
f:id:nowokay:20190731191027j:plain

デザートもありますが、だいたい取り損ねる。
f:id:nowokay:20190731191007j:plain

jWarmUp

Alibabaで作ってるjWarmupの話。
JEP draft: JWarmup precompile java hot methods at application startup f:id:nowokay:20190731195857j:plain

どうやってウォームアップするかという話でした。 f:id:nowokay:20190731195909j:plain

質疑も結構でてましたが、よく覚えてない・・・
f:id:nowokay:20190731200208j:plain

プレゼン中は終始手元を見ながら話していましたが、質疑のときにようやく前を向いた写真がとれた。
f:id:nowokay:20190731195919j:plain

動画は まだ公開されてませんが、そのうち見れるようになると思います。

TornadoVM

JavaコードをGPUFPGAで動かすという話。
JEPもある!
JEP draft: Enable execution of Java methods on GPU
f:id:nowokay:20190731200939j:plain

デモとしてKinectデータから3Dを作るコードをGPU化するとすごく速くなるというのを見せていました。
f:id:nowokay:20190731200945j:plain

コードにはforループに@Parallelをつける感じ。
f:id:nowokay:20190731200948j:plain

そうするとOpenCLに変換される。Aparapiを思い出す。
f:id:nowokay:20190731200959j:plain

TwitterのChrisさんが、なんでSmatraを引き継がなかったの?って質問がでてました。あれはStreamの最適化だったからという答えだったけど、AMDがプロジェクトを止めているので引き継ぎにくいよねという話をskrbさんとしていました。

あと、話の中ででなかったので、FPGAのビルド時間は問題にならないのか聞いてみたら、やはりコンパイルには2時間くらいかかるらしく、コンパイルをどのタイミングでやるかというオプションがあるらしいです。飛ばした資料を見せてくれました。
f:id:nowokay:20190731201003j:plain
しかし、あの場での質問、ドキドキした。

こちらも動画は非公開になってますが、そのうち見れるようになるはず。

Panama Update

Panamaの話。
f:id:nowokay:20190731202057j:plain

資料に子どもの写真がはさまって、みんな笑顔だった。
f:id:nowokay:20190731202037j:plain

内容としては、ポインタAPIとか、
f:id:nowokay:20190731202044j:plain

構造体レイアウトとか。
f:id:nowokay:20190731202054j:plain


Panama Update with Maurizio Cimadomore

Metropolis Workshop

f:id:nowokay:20190731202418j:plain MetropolisはJavaJavaを実装するプロジェクトですが、Javaで実装したJITであるGraalの話で占められていました。

ちょっと遅れていったら、前に立つ人がボソボソ話してて、断片的に聞けて何の話をしてるかもなんとなくわかるんだけどどういう意図でその話をしているのかわからなくて、15分くらいして「This is my introduction」と言って、えー自己紹介かよーって思った。
そのあともいろいろ質問が出ていたりしたのだけど、席が遠いとよく聞こえなかったり、何の話をしてるのかよくわからなかった。
と思ったら、「それはGraalVM EEの話?」という質問があって、Graalの話だったはずなので関係ないのではと思ったら「OpenJDKの話」のような返事で、つまりみんなよくわかってないからよくわからない話が繰り広げられてたんだなーという理解。

そのあと、GraalにコントリビュートするならOpenJDKとGraalVMのどちらにすればいいの?という質問があって、これも結構ぐだぐだとしていたのですが、GraalVMのほうがupstreamであるということでした。そして、じゃあそれはどんな感じでsyncされるのという話になったのですが、どうもはっきり決まってない様子。だれかが、それを決めるのがWorkshopでは〜という発言をして、もっともだなと思いました。

あと、GCJavaで書かないの?という話がでたときに、Mark Reinhold氏が全部書きなおせばいいよと男前なことをおっしゃっていました。

こんな感じで、ぐだぐだとした状況をぐだぐだと話していた感じですが、これこそWorkshopだなという感じでもありました。
しかし英語弱者には つらい。
f:id:nowokay:20190731202421j:plain

Dinner

今日は公式ディナーの日。
f:id:nowokay:20190731191149j:plain

もちろん無限ビール!
f:id:nowokay:20190731191214j:plain

そして肉! f:id:nowokay:20190731191242j:plain

最初は店がさわがしくて向かいの人と話せず隣のjyukutyoと話してたのですが、人が減って静かになったときに、向かいに座ってたZuluでコンパイラを開発している人と話をしました。

ということで、今日もおつかれさまでした!