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の話。
このセッションはすごく面白かったので、ひとつ動画を見るならこれをおすすめします。
朝ごはんを食べながら聞いてます。
JITとAOTについて比較しながら話がすすみます。
JIT結果をキャッシュすることについてJ9だなーと思いながら見てました。
比較はこんな感じに。
そしてJITサーバー!!おもしろいことを考えるなーと思いました。
そこまで含めた結果はこんな感じ。
JIT and AOT in the JVM with Mark Stoodley
Improving GraalVM Native Image
GraalVMのNative Imageについてのセッション。
初期の想定と実際の利用が違う、という話と、今後どうするかという話でした。
いつものGraalVMの紹介
制約として、最適化するところを決めるのに全部のバイトコードを見る必要があるということなどがあります。
初期の想定ではOracleデータベースに様々な言語を埋め込むために使うということで、コードはひとつのチームで書かれて制約に従うことができるし、プラットフォームも絞れるし、リフレクションやJNIは不要だと考えたということです。なので最初はTruffle推しだったんだな。
けど実際にはマイクロサービスやコマンドラインで便利だった、と。そうすると初期の想定がくずれたということです。
対応のひとつとして、LLVMを使うといろんなプラットフォームに対応できてiOSでも動かせる、って話。
Improving GraalVM Native Image with Christian Wimmer
GraalVM Workshop
GraalVMのネイティブイメージ生成についてのWorkshopでした。
主な話題は実行時の話ではなくてコンパイルに時間がかかりすぎることでした。コード生成自体ではなく静的解析に時間がかかっているとのこと。
部分コンパイルはどうか、という話には、最適化が呼び出され方で決まるところから難しいということでした。(ここで部分コンパイルはコードの一部が変更されたときにその部分だけコンパイルしなおすことを指すと思います)
同じような理由で、Shared Libraryのようにjarライブラリを事前にコンパイルしておくというのも難しいとのこと。
というのを書きながら、gccのO2、O3みたいに最適化の深さを決めれるようにできないのかなと思った。機会があったら聞いてみよう。
次に、Static Initializerの設定を自動化できないのか、という質問がMark Reinhold氏からありました。
効率よく実行するためには、Static Initializeをビルド時に行うか実行時に行うかを設定で書く必要があります。ビルド時にできる初期化はビルド時に行うほうが効率がよくなる一方、たとえばstart=currentTimeMillisのような処理をビルド時に行ってビルド時刻を埋め込むのは無意味なので実行時に行う必要があるからです。現在は安全側に振って実行時に行う設定になってますがこれを自動判定できないのか、ということです。
やはり難しそうで、MicronautやQuarkusではフレームワークに設定が埋め込まれているという話をしていました。
あとは、Unsafeは特別対応が必要でたとえばNettyではDirectByteBufferを使っているとか、8バイトのオブジェクトハンドルが4バイトの圧縮ポインタになるのでヒープが圧縮できるとか、AppCDSはあまり助けにならないとか、コンパイルイメージのヒープは読み込み専用にできる(ので効率がよい)とか、マルチクラスローダーはIssueでモジュール構造が助けになるけどみんなモジュール使ってないとかいう話をしていました。
それと、LLVMをバックエンドとして導入することについて、マルチスレッドが弱いという話とGCの問題があって、コンセプト検証の段階だけどiOSで動かすには重要という話。
という感じで、結構おもしろい話が繰り広げられていました。
JIT and AOT in the CLR
CLRでのJITの話。
あまり興味ない人が多かったぽく、空席が結構できてました。
明確には書いてないけど、前提としてGUIアプリで使うというのがあるっぽい。なので、二回目の起動からはJIT結果を使いまわせるようにしてるという話。
いろいろ作ってて、いまは3世代目を作ってるということで、それぞれの世代の説明をしていました。
JIT and AOT in the CLR with Mei-Chin Tsai
Lunch
昨日のごはんが辛かったのだけど、今日は辛くなく、代わりにナスのようなものが辛かった。
デザートもありますが、だいたい取り損ねる。
jWarmUp
Alibabaで作ってるjWarmupの話。
JEP draft: JWarmup precompile java hot methods at application startup
どうやってウォームアップするかという話でした。
質疑も結構でてましたが、よく覚えてない・・・
プレゼン中は終始手元を見ながら話していましたが、質疑のときにようやく前を向いた写真がとれた。
動画は まだ公開されてませんが、そのうち見れるようになると思います。
TornadoVM
JavaコードをGPUやFPGAで動かすという話。
JEPもある!
JEP draft: Enable execution of Java methods on GPU
デモとしてKinectデータから3Dを作るコードをGPU化するとすごく速くなるというのを見せていました。
コードにはforループに@Parallel
をつける感じ。
そうするとOpenCLに変換される。Aparapiを思い出す。
TwitterのChrisさんが、なんでSmatraを引き継がなかったの?って質問がでてました。あれはStreamの最適化だったからという答えだったけど、AMDがプロジェクトを止めているので引き継ぎにくいよねという話をskrbさんとしていました。
あと、話の中ででなかったので、FPGAのビルド時間は問題にならないのか聞いてみたら、やはりコンパイルには2時間くらいかかるらしく、コンパイルをどのタイミングでやるかというオプションがあるらしいです。飛ばした資料を見せてくれました。
しかし、あの場での質問、ドキドキした。
こちらも動画は非公開になってますが、そのうち見れるようになるはず。
Panama Update
Panamaの話。
資料に子どもの写真がはさまって、みんな笑顔だった。
内容としては、ポインタAPIとか、
構造体レイアウトとか。
Panama Update with Maurizio Cimadomore
Metropolis Workshop
MetropolisはJavaでJavaを実装するプロジェクトですが、Javaで実装したJITであるGraalの話で占められていました。
ちょっと遅れていったら、前に立つ人がボソボソ話してて、断片的に聞けて何の話をしてるかもなんとなくわかるんだけどどういう意図でその話をしているのかわからなくて、15分くらいして「This is my introduction」と言って、えー自己紹介かよーって思った。
そのあともいろいろ質問が出ていたりしたのだけど、席が遠いとよく聞こえなかったり、何の話をしてるのかよくわからなかった。
と思ったら、「それはGraalVM EEの話?」という質問があって、Graalの話だったはずなので関係ないのではと思ったら「OpenJDKの話」のような返事で、つまりみんなよくわかってないからよくわからない話が繰り広げられてたんだなーという理解。
そのあと、GraalにコントリビュートするならOpenJDKとGraalVMのどちらにすればいいの?という質問があって、これも結構ぐだぐだとしていたのですが、GraalVMのほうがupstreamであるということでした。そして、じゃあそれはどんな感じでsyncされるのという話になったのですが、どうもはっきり決まってない様子。だれかが、それを決めるのがWorkshopでは〜という発言をして、もっともだなと思いました。
あと、GCをJavaで書かないの?という話がでたときに、Mark Reinhold氏が全部書きなおせばいいよと男前なことをおっしゃっていました。
こんな感じで、ぐだぐだとした状況をぐだぐだと話していた感じですが、これこそWorkshopだなという感じでもありました。
しかし英語弱者には つらい。
Dinner
今日は公式ディナーの日。
もちろん無限ビール!
そして肉!
最初は店がさわがしくて向かいの人と話せず隣のjyukutyoと話してたのですが、人が減って静かになったときに、向かいに座ってたZuluでコンパイラを開発している人と話をしました。
ということで、今日もおつかれさまでした!