原文はこちら。
The original entry was written by Oleg Šelajev (Developer advocate for GraalVM at Oracle Labs).
https://medium.com/graalvm/graalvm-20-1-7ce7e89f066b
GraalVM 20.1.0のリリースを発表します。アプリケーションがより高速に実行できるようになります。
GraalVM Downloads
https://www.graalvm.org/downloads
GraalVM 20.1はmasterブランチからのフィーチャーリリースで、ディストリビューション全体にわたる数多くの改善を含んでいます。GraalVMのリリースを最高のものにするために、様々なチームや個々の貢献者からのサポートに感謝いたします。期待通りに動作しない場合にIssueを立ててくださったり、有用な機能の提案やGraalVMの普及、GitHub上のプロジェクトへの貢献をしてくださったりするみなさまに感謝いたします。
Issues
https://github.com/oracle/graal/issues
機能の詳細リストは、GitHubのリリースノートとコンポーネントの変更ログをご覧ください。以下ではこのリリースのハイライトをご紹介します。
20.1.0 Release Notes
https://www.graalvm.org/docs/release-notes/20_1/
GraalVM GitHub Repositories
https://github.com/oracle/graal
Faster runtime
新機能の一つとしてGraalVMコンパイラにおけるKotlinのコルーチン (coroutine) のサポートの改善があります。以前のGraalVMコンパイラではJavaバイトコードの非可約ループ (irreducible loops) の処理方法が分かりませんでした。これはループの入り口に行かずにループコードの途中にジャンプ可能という、バイトコードの中でも特にレアなパターンで、JavaやScala、GroovyやClojureをコンパイルしたときには発生しませんが、バイトコード難読化ツールを実行したり、ループ内でKotlinのコルーチンを使用したりすると発生する可能性があります。
このようなコードは処理できないため、これまではコンパイラはこのパターンに遭遇した場合、ユニット全体のコンパイルを中止しインタープリタに頼ってコードを実行しなければなりませんでした。20.1のGraalVMコンパイラでは、このようなコードを処理できるようになった結果、以前のバージョンに比べて大幅に高速化され、ネイティブイメージでもこのようなコードを処理できるようになりました。
kotlinx.coroutines プロジェクトのベンチマークを見てみると、大幅な改善が見られることがわかります。プロジェクトをクローンして、以下のコマンドで実行し、ご自身の目で確認ください(数値はオペレーションあたりの時間で、数値が小さいほどよいです)。
gradle - no-daemon cleanJmhJar jmh -Pjmh="scrabble"
Library support for Kotlin coroutines
https://github.com/Kotlin/kotlinx.coroutines
# GraalVM Enterprise 20.0
Benchmark Mode Cnt Score Error Units
FlowPlaysScrabbleBase.play avgt 7 256.648 ± 3.574 ms/op
FlowPlaysScrabbleOpt.play avgt 7 114.249 ± 1.465 ms/op
RxJava2PlaysScrabble.play avgt 7 121.020 ± 3.820 ms/op
RxJava2PlaysScrabbleOpt.play avgt 7 35.641 ± 6.984 ms/op
SaneFlowPlaysScrabble.play avgt 7 75.944 ± 8.367 ms/op
SequencePlaysScrabble.play avgt 7 16.180 ± 4.012 ms/op
# GraalVM Enterprise 20.1
Benchmark Mode Cnt Score Error Units
FlowPlaysScrabbleBase.play avgt 7 85.204 ± 14.663 ms/op
FlowPlaysScrabbleOpt.play avgt 7 21.275 ± 6.202 ms/op
RxJava2PlaysScrabble.play avgt 7 121.277 ± 24.748 ms/op
RxJava2PlaysScrabbleOpt.play avgt 7 37.277 ± 8.069 ms/op
SaneFlowPlaysScrabble.play avgt 7 16.945 ± 3.285 ms/op
SequencePlaysScrabble.play avgt 7 15.811 ± 4.544 ms/op
ループ内でコルーチンを使わないベンチマークではあまり変化はありませんでしたが、使うもの(例えばSaneFlowPlaysScrabble、FlowPlaysScrabbleBase、FlowPlaysScrabbleOptなど)の場合、GralVM 20.1ではおよそ4倍高速です。
GraalVMコンパイラの改善点はもっとあります。特筆すべき例の一つに、JDK 11ベースのGraalVMで高速ロックが使用されている場合の大幅な改善が挙げられます。GraalVM 20.1では、多くのベンチマークでスコアを改善しており、時には以前よりも40%近く速くなったように劇的に改善されています。例えば、Renaissance ベンチマークスイートのログ回帰ベンチマークでは、以下のようです。
Renaissance Suite
https://renaissance.dev/

Better user experience for native image
今リリースでは、GraalVM native-imageユーティリティに注目が集まりました。GraalVM native-imageに関するフィードバックの中で最も注目すべきものの一つは、コンパイル時間があまり短くないということです。実際、native-imageユーティリティは、アプリケーション内のすべてのクラスを分析し、実行ファイルに含める必要のあるクラスを特定する必要があり、これにはかなりの時間とメモリが必要です。
20.1ではこの問題に対処するために、「飽和型フロー」(saturated type flows)と呼ばれる新しいメカニズムを追加し、解析を高速化しました。デフォルトではまだ有効になっていないので、以下のコマンドラインオプションを使って手動で有効にする必要があります。
-H:+RemoveSaturatedTypeFlows
飽和型フローを有効化すると、ビルドプロセスは顕著に高速になります。例えば、spring-graalvm-nativeを使ってSpring Petclinicサンプルをコンパイルしてネイティブイメージにすると、ビルドプロセスは以前に比べておよそ25%高速になり、メモリ消費量も25%削減されています。
GraalVM native experimental support for Spring Boot applications
https://github.com/spring-projects-experimental/spring-graalvm-native
Springといえば、SpringアプリケーションをGraalVMネイティブイメージとして実行できるようにする取り組みは順調に進捗しており、この中で出た数多くの問題が20.1で解決しています。詳細はGitHubでご覧ください。
Springに関連するIssue
https://github.com/oracle/graal/issues?q=is%3Aissue+is%3Aclosed+label%3Aspring
20.1で実装されたネイティブイメージのためのもう一つの素晴らしいQoLの改善点は、シグナルハンドラを実行ファイルに含めることができるようになった点です。以下のオプションを指定すると、アプリケーションはデフォルトのSIGTERMハンドラを登録します。
--install-exit-handlers
これは、Dockerのエントリポイントとしてネイティブイメージを実行している場合において、最も有用です。以前のようにネイティブイメージが原因でCtrl + CでDockerコンテナを停止できない、ということがなくなりました。
Improvements in languages and tools
GraalVMのJavaScriptでは、ECMAScript 2020モードの機能がデフォルトで有効になりました。GraalVM 20.1のJavaScript実装でのもう一つの興味深い変更点は、GraalVM言語として構築された正規表現エンジンであるTRegexが、JavaScriptエンジンに必要なすべての必要なregex機能をサポートするようになったことです。
TRegex
https://github.com/oracle/graal/tree/master/regex
Pythonが3.8.2にアップデートされ、PythonのプリミティブであるList、Dict、tupleのパフォーマンスが大幅に改善されました。また、Linuxと同じくginstallを使い、NumPyがMacOS上で動作するようになりました。
TruffleRubyにはnightly buildがあります。バンドルのインストールが大幅に高速化され、VALUEにCRubyと同じCのデータ型を使用することで、C拡張機能との互換性が向上しました。
TruffleRuby
https://github.com/oracle/truffleruby/blob/master/README.md
R実装にはLinux、macOSでGCCランタイムライブラリが含まれています。さらにGFortranは実行のための要件ではなくなりました。これにより、CRANパッケージのインストールが大幅に簡素化されました。
GraalVMのツールにもたくさんの改善点があります。Language ServerとVSCode extensions for GraalVMの安定性が改善されました。JavaScriptに加え、RubyやRもLanguage Server Protocolをサポートします。
VisualVMには、libgraalによるメモリ消費量を表示する機能が追加されました。これは設定ミスによる問題を発見するのに役立ちます。

Conclusion
GraalVM 20.1は、すべてのコンポーネントに渡って多くの改善が施されたメジャー・フィーチャー・リリースです。多数のJavaワークロード、idiomaticなKotlin、Pythonのパフォーマンスが大幅に改善され、Rパッケージのインストールが簡単になっており、JavaScript 2020の機能がデフォルトで有効になっています。その他にも多数のバグ修正やパフィーマンスや安定性の向上など、ここでは言及しきれないほどの数になりますが、重要な機能であることに変わりはありません。
新機能や注目すべき機能の詳細はリリースノートをご覧ください。そしてGitHubにあるプロジェクトコンポーネントの変更ログの確認もご検討ください。
20.1.0 Release Notes
https://www.graalvm.org/docs/release-notes/20_1/
GraalVM GitHub Repositories
https://github.com/oracle/graal
GraalVM 20.1は以下からダウンロードできますので、アプリケーション実行に使ったり、新たなプロジェクトをビルドしてください。
GraalVM Downloads
https://www.graalvm.org/downloads
フィードバックがあれば、TwitterやSlack、GitHubからお知らせください。
Twitter
https://twitter.com/graalvm
SlackへのInvitation
https://www.graalvm.org/slack-invitation/
GitHub
https://github.com/oracle/graal