このエントリは以下のエントリをベースにしています。
This entry is based on the following one written by Thomas Wuerthinger (Senior Research Director at Oracle Labs, GraalVM project lead).
https://medium.com/graalvm/graalvm-19-1-compiling-faster-a0041066dee4
機能追加、互換性の向上、バグの修正などが含まれているGraalVM 19.1がリリースされました。是非試していただき、フィードバックをお願いいたします。
GraalVM Download
https://graalvm.org/downloads
Issues
https://github.com/oracle/graal/issues
以前のリリースと同様、coreのダウンロードにはJava 8準拠のJava Virtual Machine (1.8.0_212)、Node.js実装 (v10.15.2)、JavaScript実装 (ECMAScript 2019)、LLVM bitcodeランタイム (6.0.0) が含まれています。オプションのコンポーネントは以下のコマンドで追加できます。
gu install native-image ruby R python
詳細を記載したリリースノートは以下をご覧ください。以後では、GraalVM 19.1の主要な改善点とバージョン番号体系の詳細について説明していきます。
Release Notes (19.1.0)
https://www.graalvm.org/docs/release-notes/#1910
Compiling Faster
just-in-time (JIT) コンパイルシステムの課題の一つとして、コンパイルステップをできる限り高速にする必要があります。先日、Apache Sparkリポジトリからチェックアウトしたものをコンパイルするために、Scala sbtビルドツールをGraalVMをJITモードで使うというサンプルワークロードを分析しました。
sbt – The interactive build tool
https://www.scala-sbt.org/
Apache Spark
https://github.com/apache/spark
このワークロードは3分以上かかるもので、Java Mission Controlを使用してGraalVMのJITコンパイルスレッドの動作を見ると、実行中はコンパイルが走っていることがわかります。
Java Mission Control
https://www.oracle.com/technetwork/java/javaseproducts/mission-control/java-mission-control-1998576.html

最終的に最適なマシンコードが実行可能になると、ワークロードはすでに終了しています。このマシンコードを早くインストールすることが、このような中程度の長さのプログラムをより高速に実行するためには重要なので、JITコンパイル速度を向上させるために、いくつかの改善を行いました。具体的には、コンパイラ自体のネイティブイメージを生成する際に、プロファイルガイド付き最適化を使用しています。また、最適化のヒューリスティックを改善して、計算量を減らしました。その結果、コンパイル速度はほぼ2倍になっています。

ワークロード終了時、コンパイルによって消費されるCPU時間は約30%少なくなりました。より良いマシンコードを早く入手できるようにすることで、ワークロードの全体の実行時間が13%短縮されます。これは中規模のプログラムにとって重要な改善です。
Versioning
GraalVMプロジェクトは急速に進化し、さまざまなコンポーネントが含まれているため、適切なバージョン管理方法を定めるのは課題になっていました。多言語仮想マシンプロジェクトとしてのGraalVMの進化は急激で、GraalVMがサポートするすべての言語のニーズを受け入れることを望んでいます。開発者が最新のリリースで最新の機能を試すことができるよう、頻繁にリリースしたいと考えています。
現時点では、GraalVMの19という1個のリリースブランチがあり、来年はGraalVM 20、その後はGraalVM 21、という感じでリリースする予定です。その年の間にプロジェクトメインラインから、19.1、19.2、19.3といった具合にいくつかのリリースを出す予定です。予定ではおよそ3ヵ月毎にリリースし、GraalVMが依存するプラットフォーム(OpenJDK、Node.js、LLVM、Ruby、R、Python)へのアップデートに追随していきます。
アップデートリリースはmasterから生成され、最新のものを含む予定です。アップデートプロセスをスムーズにして徐々に新機能を導入したいと考えています。つまり、最初は実験的フラグで主要な変更を隠しておき、その後フラグをデフォルトで有効にする、という流れです。これにより、ユーザーが事前に調整できるようにしながら、プロジェクトの速度を速めることができます。
これらのメジャーリリースに加えて、重要なバグ修正とセキュリティアップデートのみを含むアップデートリリースを作成します。最新のメジャーリリース用にこのようなアップデートリリースを作成し、3桁目で区別します。たとえば、最近、19.0メジャーリリース用に19.0.2アップデートリリースを作成しました。現在、当該年の最終リリースを長期サポート(Long Term Support)できるようにする予定です。つまり、20.0がリリースされた後19.3(もしくは19.4)がリリースされる予定です。正確な日をリリースカレンダーに記載する予定にしていますので、ユーザーの方々は事前に計画できることでしょう。
Outlook
このリリースに対するフィードバックを受け付けていると同時に、今後も進化を続け、既に次のGraalVM 19.2への作業に取りかかっています。
GraalVM Download
https://graalvm.org/downloads
Issues
https://github.com/oracle/graal/issues