原文はこちら。
The original article was written by Alina Yurenko (Developer Advocate for GraalVM, Oracle Labs).
https://medium.com/graalvm/graalvm-22-1-developer-experience-improvements-apple-silicon-builds-and-more-b7ac9a0f6066
GraalVM 22.1がリリースされました。このリリースには新機能や多数の改善点が含まれています。このエントリでハイライトを取り上げます。
このリリースには、JDK 11ベースならびにJDK 17ベースのビルドが含まれています。いつも通り、GraalVM CommunityはGitHubから、GraalVM EnterpriseはOTNからダウンロードできます。
GraalVM Community Edition 22.1.0
https://github.com/graalvm/graalvm-ce-builds/releases
Oracle GraalVM Enterprise Edition 22
https://www.oracle.com/downloads/graalvm-downloads.html
VS CodeのGraalVM Extension Pack for Javaや、macOSのHomebrewを使っても最新のGraalVMをインストールできます。
GraalVM Extension Pack for Java
https://marketplace.visualstudio.com/items?itemName=oracle-labs-graalvm.graalvm-pack
Homebrew Tap for GraalVM
https://github.com/graalvm/homebrew-tap
では、この新リリースに何が入っているか見ていきましょう。または、リリースストリームのリプレイをご覧ください。
Native Image
ここ数回のリリースでは、GraalVM Native Imageの開発者体験を向上させるために数多くの取り組みをしてきました。例えば、ビルド時間や必要メモリの改善、新しいビルド出力の導入、ネイティブビルドプラグインの更新などです。このリリースではさらなる機能、Native Imageのクイックビルドモードがが導入されました。Native Imageでコンパイルするアプリケーションのサイズと複雑さによっては、GraalVMがアプリケーション全体とその依存関係を分析し、その到達可能なすべてのコードを最適化してコンパイルする必要があるため、ビルドプロセスにかなりの時間がかかることがあります。このような詳細のプロセスがNative Imageでは必須であり、ランタイムパフォーマンスを確保するために重要ではありますが、正しい動作を確保し、結果を迅速に得たい場合には、開発目的のために簡素化できるようになりました。クイックビルドモードを有効にすると、コンパイラはより少ない最適化でエコノミーモードで動作し、その結果、コンパイル時間が大幅に短縮されます。
我々は、GraalコンパイラをコンパイルしてGraalVMビルドに同梱されているlibgraal共有ライブラリにするのに要する時間で、クイックビルドモードの影響を測定しました。

クイックモードでは、ビルドプロセスにおけるコンパイルステージで81%高速になっています。また、結果としてビルド時間全体では43%スピードアップしました。
クイックモードを有効にするには、native-image
ユーティリティを実行する際に -Ob
(大文字のOと小文字のb)を追加してください。以下はその例です。
$ native-image -Ob HelloWorld
クイックビルドモードは、ランタイムパフォーマンスとメモリ使用量を犠牲にしてビルド時間を最適化するため、開発目的でのみ推奨していることに注意してください。本番環境での実行には、実行時のパフォーマンスとメモリ使用量を最適化するデフォルトのコンパイルモードを使用してください。
今回のリリースはクイックビルドモードが含まれる最初のリリースですので、皆様からのフィードバック、問題報告、提案を募集しています。特に、ランタイムパフォーマンスを改善し、ビルドプロセスの他のステージの高速化を予定しています。
また、ビルド時間とサイズも改善されました。native-image
ユーティリティの性能向上とメモリフットプリントの削減により、実行ファイルのビルド時間が短縮されました(新しいクイックビルドモードとは無関係です)。下表は、過去数回のGraalVMのリリースにおいて、Spring petclinic-jdbcの実行ファイルサイズと実行ファイルビルド時間が継続的に減少していることを示しています。この数値は、Linux、AMD64、JDK 11、GraalVM Enterprise、spring-native 0.10.3(GraalVMの古いバージョンと比較できるように、spring-nativeの古いバージョンを使用しました)を備えた開発用ノートパソコンで測定されたものです。
Spring PetClinic Sample Application built with Spring Data JDBC
https://github.com/spring-petclinic/spring-petclinic-data-jdbc

GraalVM 22.1では、実行ファイルのビルド処理が、21.1よりデフォルトモードで26%、クイックビルドモードでは54%高速化されました。
GraalVM 21.3で発表された条件付き設定は、GraalVMのトレーシング・エージェントを使用して生成することができるようになりました。このアプローチでは、(たとえばtypeReachable
のような)提供された条件が満たされた場合にのみクラス設定エントリを適用するため、設定がより正確になり、ネイティブ実行ファイルのサイズを小さくできます。
GraalVM 21.3 is here: Java 17, Native Image performance updates and more 🚀
https://medium.com/graalvm/graalvm-21-3-is-here-java-17-native-image-performance-updates-and-more-ac4cbafcfc05#fba6
https://logico-jp.io/2021/10/23/graalvm-21-3-is-here-java-17-native-image-performance-updates-and-more/#43fb
Assisted Configuration with Tracing Agent
https://www.graalvm.org/22.0/reference-manual/native-image/Agent/
さらに、native-image
のデフォルトの挙動をjavaコマンドに合わせました。デフォルトでは、クラスパスやモジュールパスでクラスが見つからなくてもビルドが失敗しなくなりました。特定のクラスが利用できない場合にアプリケーションが異なる動作を定義できるため、場合によってはこれが望ましいと言えます。しかし、このようなクラスが実行時に明示的に必要とされる場合、ネイティブ実行ファイルは(例えばjava.lang.NotClassDefFoundError
で)失敗するようになりました。このようなシナリオを防ぐために、Native Imageに新たに --link-at-build-time
オプションが追加されました。これにより、ビルド時にすべてまたは一部のクラスが利用できない場合、ビルドプロセスが失敗します。このオプションは次の2つの方法で使用できます:
- 引数なしで利用:この場合はスコープ内のすべてのクラスが完全に定義されている必要があります、
- 引数付きで利用:例えば
--link-at-build-time=foo.bar.Foobar,demo.myLibrary.Name,…
この場合は引数は完全修飾クラス名またはパッケージ名でなければなりません。
Preview build for Apple Silicon
Apple Siliconのサポートは、コミュニティから最も要求の多かった機能の1つでした。
Support for Apple M1 (darwin-aarch64) #2666
https://github.com/oracle/graal/issues/2666
22.1リリースの時点で、GraalVM Communityがこのプラットフォームで公式に利用可能になったことを発表できることを嬉しく思います。
darwin-aarch64ビルドには、以下のコンポーネントが含まれています。
- Graalコンパイラを搭載したJVM
- Native Image
- JavaScript
- Java on Truffle (Espresso)
これはプレビュービルドであるため、今後のリリースではいくつかの変更が予想されることに注意してください。もし何か問題が発生した場合は、フィードバックをいただけると幸いです。
Officialなビルドは今日初めて公開されましたが、それ以前の開発版ビルドに対しても、すでにコミュニティから素晴らしいフィードバックが寄せられています。


Python
Pythonランタイムに、frozenモジュールのサポートを追加しました。これにより、REPL開始までに30%高速に、そしてメモリ利用量が40%削減されます。この変更は、頻繁に使用されるモジュールが解析され、バイトコードに変換され、バイナリ内部に格納されることを意味します。起動時に、ランタイムはこのバイトコードを直接ロードするため、ファイルシステムからソースファイルをロードして解析するオーバーヘッドを回避します。
また、いつも通りの互換性作業も続けており、lxml
、pytz
、Pillow
、urllib3
、setuptools
、pytest
、twine
、jinja2
、six
などのPyPIパッケージのサポートが改善されています。
Ruby
このリリースの TruffleRuby では、外部例外(foreign exceptions)を完全にサポートするようになりました。今後外部例外はRuntimeError
に変換されなくなり、外部例外として残ります。取り扱い方法についてはドキュメントを参照してください。
Polyglot Programming
https://github.com/oracle/truffleruby/blob/master/doc/user/polyglot.md
このような例外を完全に統合し、Exception
のほとんどのメソッドを持ち、rescue Polyglot::ForeignException
やrescue foreign_meta_object
で救出することができるようになりました。
その他の更新については、プロジェクトの変更履歴を参照してください。
TruffleRuby – GraalVM Community Edition 22.1.0
https://github.com/oracle/truffleruby/releases/tag/vm-22.1.0
JavaScript
今回のJavaScriptランタイムのリリースでは、Node.jsアプリケーションのための実験的なエンジンキャッシングサポートを導入しました(GraalVM Enterpriseの機能です)。エンジンキャッシュは、ロード、パース、プロファイリング、コンパイルなどの操作に起因する、Truffle言語上で実行されるプログラムのウォームアップを排除することを目的としています。Temporal、Intl.NumberFormat v3、ArrayGrouping、Array Find from Last など、いくつかの新しい ECMAScript 機能を実装しています。
詳しくはプロジェクトの変更履歴をご覧ください。
GraalVM JavaScript (Graal.js) Changelog
https://github.com/oracle/graaljs/blob/master/CHANGELOG.md#version-2210
R
R のグラフィカルサポートが改善されました。ggplot2
のようなgrid
やgrid
ベースのパッケージに加え、GraalVMのRでは、プロットを素早く生成するためのシンプルで便利な関数を提供するbase graphicsパッケージをサポートするようになりました。

Java on Truffle
このリリースでは、いくつかの新しいHotSwap機能が追加されています。例えば、スーパークラスと実装済みインターフェースの変更のサポート、状態を保持しながらのMove Field in Hierarchy(階層内のフィールド移動)リファクタリングのサポート、フィールドとクラスのアクセス修飾子の変更(デフォルトでOn)などです。また、Java on Truffle LLVM Javaライブラリが(以前はLinuxのみでしたが)macOSでも利用できるようになり、gu install espresso-llvm
でインストールできるようになりました。この変更により、より多くのシナリオでJava on Truffleを使用できるようになりました。例えば、JVM上で動作するJavaプログラムで直接Java on Truffleを使用したり、Native Imageアプリケーションで複数のゲストコンテキストで使用したりできます。
Tooling and Developer Experience
GraalVM VS Code extensionやCI/CDワークフローなどを含む、開発目的でGraalVM Enterprise Editionのインストールと利用をより簡単にしました。Graal UpdaterやGraalVM Extensionでコンポーネントをインストールする際にやるべきことは、メールアドレスを提供し、ライセンスに同意するだけです。その後、ローカルやビルドマシンでGraalVM EEコンポーネントをダウンロードするために利用可能なトークンを受け取ることができます。また、GraalVMのGitHub Actionにこのサポートを追加しました。
VS Code拡張機能のもう一つの更新で、トレーシングエージェントを介した動的機能の簡単な設定を提供するために、Native Imageペインが追加されています。

また、追加構成なしでVS CodeでVisualVM統合が動作するようになっています。これにより、extensionのUIからVisualVMを開き、アプリケーションの監視を開始できます。
GraalVM Tools for Micronaut extensionは、Oracle Autonomous Databaseを含む様々なJDBCアクセス可能なデータベースの開発をサポートするようになりました。データベースの登録、Micronautの@Entity
や@Repository
クラスの作成、Micronaut Dataファインダーや@Query
アノテーションでのSQLコード補完、データベースアプリケーションの簡単なデバッグなどの機能が利用できます。

Truffle Language and Tool Implementations
今リリースの大きな変更点として、TruffleStringsの導入があります。これは String 型の効率的な実装で、Truffle言語間で共有できます。我々は、より簡単な相互運用性とより良いパフォーマンスのために、言語の実装者がTruffle Stringsをその言語の文字列型として使用することを推奨します。java.lang.String
との違いはTruffleStringsのガイドで詳細を説明しています。GraalVM 言語のうち、JavaScript と Regex はすでに新しい実装を使用するように移行しています。今後のアップデートと最適化にご期待ください。
Truffle Strings Guide
https://github.com/oracle/graal/blob/master/truffle/docs/TruffleStrings.md
Differences to java.lang.String
https://github.com/oracle/graal/blob/master/truffle/docs/TruffleStrings.md#differences-to-javalangstring
Community
いつものように、私たちはこのリリースに協力してくれたコミュニティとエコシステムのパートナーに感謝しております。GitHubで多くの有益な報告やコントリビューションを戴いています。
GitHubのPull Request
https://github.com/oracle/graal/pulls?q=is%3Apr+is%3Amerged+label%3Aoca-signed
GraalVMのプラットフォームでフィードバックを共有し、他のコミュニティメンバーを助けるいただくと、総合的に皆様のためにGraalVMをより良くするために支援いただいております。特に、
SafepointBegin
,SafepointEnd
,GarbageCollection
,GCPhasePause
,GCPhasePauseLevel
などの新しいJFRイベントのNative ImageでのサポートはRed Hatから提供いただきました。- TruffleRubyのRuby 3キーワード引数のサポートの大部分は、Shopify のエンジニアリングチームから提供されたものです。
- Apple Silicon のサポートは、多くのコミュニティからのフィードバックとインプットを受けて実装されました。
Shopify Engineering
https://shopify.engineering/
Conclusion
GraalVMコミュニティの皆様、本リリースへのフィードバック、ご提案、ご協力をありがとうございました。このリリースに関する追加のフィードバックや、将来のリリースに追加して欲しい機能に関する提案があれば、Slack、GitHub、Twitterで共有してください。
Slack invitation
https://www.graalvm.org/slack-invitation
GitHub Issues
https://github.com/oracle/graal
Twitter
https://twitter.com/graalvm