リリース・ノート
このページでは、リリース間のOracle GraalVM Enterprise Edition 21の変更点について説明します。GraalVM Enterpriseは様々なコンポーネントで構成され、変更点はコンポーネント別にリストされています。リリース・ノートは、操作性上の理由から降順にグループ化されています。
更新頻度の詳細は、GraalVM Enterpriseのバージョン・ロードマップを参照してください。
Oracle GraalVM Enterprise Edition 21.3.9
(2024-01-16)
これは、Oracle GraalVM Enterprise Edition 21.3.x用の2024年1月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2024年1月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次に示す注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 17.0.10+11 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
- 11.0.22+9 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 8u401-b10 (Java 8ベースのGraalVM Enterprise)。「Java SE 8u391リリース・ノート」を参照してください。
- コンパイラの修正:
IntegerLessThanNode
にキャストする前にコンパイラがスタンプをチェックするようになりました。int
範囲のstrideオーバーフローを処理することでループ展開の最適化が改善されました。checkcast
およびinstanceof
の生成中の明示的なnullチェック例外が削除されました。- 条件付き移動最適化コスト計算が改善されました。
- Pythonコードを使用してJavaホスト・アプリケーションのBouncy Castleライブラリを事前にコンパイルするときに、
ConditionalMoveOptimizationPhase
でStackOverflowError
が発生するバグが修正されました。
- ネイティブ・イメージの修正:
- Windows 11およびWindows Server 2022を認識するようにOS検出コードが更新されました。
- Truffleツールと言語の修正:
- VMのシャットダウン時にエンジンをクローズしないようにする修正が追加されました。
- PiNodesがアタッチされている場合、
FixedGuardNode
およびConditionAnchorNode
の消失は許可されません。 - 必須の実験プロパティ
debuggerId
の追加によって、Chrome DevToolsでGraalVMプロセスにアクセスできない問題が修正されました。 - JSONパーサー・ライブラリorg.jsonがバージョン20231013にアップグレードされました。
InteropByteBufferTest#testLargeInteropBuffer
がOutOfMemoryエラーで失敗しないようにするための修正が追加されました。
Oracle GraalVM Enterprise Edition 21.3.8
(2023-10-17)
これは、Oracle GraalVM Enterprise Edition 21.3.x用の2023年10月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2023年10月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次に示す注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 17.0.9+11 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
- 11.0.21+9 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 8u391-b12 (Java 8ベースのGraalVM Enterprise)。「Java SE 8u391リリース・ノート」を参照してください。
- コンパイルの修正:
- インダクション変数として誤って検出された代替
Phi
を修正しました。
- インダクション変数として誤って検出された代替
- Truffleフレームワークの修正:
- すでにシャットダウン中の場合、シャットダウン・フック登録が失敗することがあります。
- ポリグロット・マップの反復時の
guestToHostCodeCache
の無制限拡張が修正されました。
Oracle GraalVM Enterprise Edition 21.3.7
(2023-07-18)
これは、Oracle GraalVM Enterprise Edition 21.3.xの2023年7月のOracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2023年7月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、およびプラットフォーム更新が含まれます。
- GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 17.0.8+9 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
- 11.0.20+9 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 8u381+9 (Java 8ベースのGraalVM Enterprise)。「Java SE 8u381リリース・ノート」を参照してください。
Oracle GraalVM Enterprise Edition 21.3.6
(2023-04-18)
これは、Oracle GraalVM Enterprise Edition 21.3.x対応の2023年Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2023年4月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、およびプラットフォーム更新が含まれます。
- GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 17.0.7+8 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
- 11.0.19+8 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 8u371+10 (Java 8ベースのGraalVM Enterprise)。「Java SE 8u371リリース・ノート」を参照してください。
- Node.jsをバージョン14.21.3にアップグレードしました。
Oracle GraalVM Enterprise Edition 21.3.5
(2023-01-17)
これは、GraalVM Enterprise 21.3.x対応の2023年1月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2023年1月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、およびプラットフォーム更新が含まれます。
- GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 8u361 (Java 8ベースのGraalVM Enterprise)。「Java SE 8u361リリース・ノート」を参照してください
- 11.0.18 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 17.0.6 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
- Node.jsがバージョン14.21.1に更新されました。
Oracle GraalVM Enterprise Edition 21.3.4
(2022-10-18)
これは、GraalVM Enterprise 21.3.x対応の2022年10月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2022年10月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、およびプラットフォーム更新が含まれます。
- GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 8u351 (Java 8ベースのGraalVM Enterprise)。「Java SE 8u351リリース・ノート」を参照してください
- 11.0.17 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 17.0.5 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
Oracle GraalVM Enterprise Edition 21.3.3.1
(2022-09-20)
これは、次を含むGraalVM Enterprise 21.3.3ブランチのパッチ・リリースです:
- プラットフォームの更新:
- 11.0.16.1 (Java 11ベースのGraalVM Enterprise)
- 17.0.4.1 (Java 17ベースのGraalVM Enterprise)
- 代替ファイル・システム・プロバイダを使用したパスの解析中に、Truffleファイル・システムのサンドボックスがホスト・ファイルをチェックしないようにします。
InsightFilter
のhashCode()
メソッドとequals()
メソッドが修正され、コンテキスト管理が修正されています。- インサイト・ヒープ・ダンプの深さを修正しました。これはプリミティブには適用されず、フレームではなく変数に適用されます。
- null引数をzero引数として扱わないように
PolyglotFunction
を修正しました。 - 図形の汎用化によってスタックしていたJavaScriptスレッドが修正されました。
ConstantBlindingPhase
のサブクラス化が許可されます。
Oracle GraalVM Enterprise Edition 21.3.3
(2022-07-19)
これは、Oracle GraalVM Enterprise Edition用の2022年7月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2022年7月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、およびプラットフォーム更新が含まれます。
- GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 8u341 (Java 8ベースのGraalVM Enterprise)。Java SE 8u341リリース・ノートを参照してください
- 11.0.16 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 17.0.4 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
Oracle GraalVM Enterprise Edition 21.3.2
(2022-04-19)
これは、Oracle GraalVM Enterprise Edition用の2022年4月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2022年4月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、およびプラットフォーム更新が含まれます。
- GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 8u331 (Java 8ベースのGraalVM Enterprise)。「Java SE 8リリース・ノート」を参照してください
- 11.0.15 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 17.0.3 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
Oracle GraalVM Enterprise Edition 21.3.1
(2022-01-18)
これは、Oracle GraalVM Enterprise Edition用の2022年1月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2022年1月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたすべてのOracle Java Development Kit (JDK)セキュリティ修正、およびプラットフォーム更新が含まれます。
- GraalVM Enterprise EditionのビルドのベースとなるOracle JDKリリースは、次のように更新されました:
- 8u321 (Java 8ベースのGraalVM Enterprise)。「Java SE 8リリース・ノート」を参照してください
- 11.0.14 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 17.0.2 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
- JDKバージョン12、13、14、15および16のサポートが削除されました。
- Node.jsがバージョン14.18.1に更新されました。
Oracle GraalVM Enterprise Edition 21.3.0
(2021-10-19)
- Javaおよびコンパイラの更新
- プラットフォームの更新
- ネイティブ・イメージ
- ポリグロット・ランタイム
- Java on Truffle
- JavaScript
- Ruby
- Python
- R
- LLVMランタイム
- WebAssembly
- ツール
- ポリグロット埋込み
- Truffle言語およびツールの実装の更新
プラットフォームの更新
-
Java 17サポート: Oracle Java 17およびOpenJDK 17に基づくGraalVMディストリビューションをダウンロードできます。
-
GraalVM Enterprise EditionのビルドのベースとなるOracle JDKリリースは、次のように更新されました:
- 8u311 (Java 8ベースのGraalVM Enterprise)。「Java SE 8リリース・ノート」を参照してください
- 11.0.13 (Java 11ベースのGraalVM Enterprise)。「Java SE 11リリース・ノート」を参照してください
- 17.0.1 (Java 17ベースのGraalVM Enterprise)。「Java SE 17リリース・ノート」を参照してください
Javaおよびコンパイラの更新
- 非カウント・ループでのストリップ・マイニング最適化が改善されました。次が含まれます:
- 非カウント・ループのストリップ・マイニングがデフォルトで有効になりました。
- 非等価性チェック・ループのカウント・ループ検出が改善されました。カウント・ループに変換される非カウント・ループが増え、さらなる最適化(ベクトル化や部分的なアンロールなど)の対象になります。このような追加の最適化によって、パフォーマンスが向上します。このループを例にとります:
for (int i = start; i != end; i++){ // body }
コンパイラは
start < end
を静的に証明できないため、このループが終わる前にi
をオーバーフローさせてしまうことがあります。コンパイラが、ループの前にstart < end
チェックを挿入できるようになりました。このチェックが失敗すると、コンパイル済コードは脱最適化されます。次にコンパイルされたときにチェックは省略され、ループは非カウントとして処理されます。
- 実行不可能パス相関の最適化が新たに追加されました。このスニペットをご覧ください:
class A { ... } class B extends A { ... } if (x > 5) { if (y instanceof A) { throw Error(); } } loop { int foo = <expensive computation>; if (x > 10) { if (y instanceof B) { bar(foo); } } }
bar(foo)
コールが実行されるのはx > 10 && y instanceof B
の場合のみです。ただし、この条件はx > 5 && y instanceof A
を暗黙に示すため、throw Error()
が実行されます。つまり、bar
へのコールが実際に実行されることはありません。現在、Graalコンパイラはこれを認識し、bar
へのコールとfoo
(bar
に対する引数としてのみ使用されている場合)の計算の両方を削除します。この最適化はデフォルトで有効になっており、-Dgraal.InfeasiblePathCorrelation=false
で無効にできます。 - JITスプレー攻撃を防ぐために定数ブラインディングのサポートが実装されました。JITスプレー攻撃では、攻撃者がJITコンパイラを使用して、即時値を含む操作を使用して、実行可能メモリーに機械命令を注入します。メモリー破損の脆弱性が存在している場合、攻撃者は制御フローを注入済コードにリダイレクトできます。定数ブラインディング・フェーズでは、コード内のユーザー指定定数がランダムに生成されるキーで暗号化されるため、攻撃者は実行可能メモリーに存在する即時値に依存できなくなります:
mov reg, $0xF5952C xor reg, $0xABCDEF // reg = 0x5E58C3
定数ブラインドは試験段階の機能であり、デフォルトでは無効になっています。
-Dgraal.BlindConstants=true
で有効にします。-Dgraal.MinimumBlindedConstantSize
を使用して構成すると、定数サイズ(バイト)を超えた場合に定数ブラインディングが適用されます。 - シーケンシャル・コードのSIMD (単一命令複数データ)ベクトル化の最適化が改善されました。
- SIMDベクトル化と部分的なループ・アンローリングを同時に有効にできるようになりました。SIMDベクトル化のメリットを最大限に得るために、
-Dgraal.PartialUnroll=false
を指定する必要はなくなりました。この最適化はデフォルトで有効になりました。 - SIMDベクトル化で、ベクトル・レジスタを完全に満たさない操作のグループを作成できるようになりました。これによって、SIMDベクトル化で実現できる加速機会の回数が増え、全体的なスループットのパフォーマンスが向上します。
- SIMDベクトル化でのグループ化とパターン照合が改善され、この最適化が検出して利用できるSIMD機会の回数が増加します。
- SIMDベクトル化と部分的なループ・アンローリングを同時に有効にできるようになりました。SIMDベクトル化のメリットを最大限に得るために、
-
特定のコール元/コール先の組合せでインライン化によってレジスタ割当てやコード・サイズに悪影響が生じないようにする新しい最適化が追加されました。これにより、プログラム内に同時に存在する値の数が少なくなり、パフォーマンスが向上する可能性があります。
- JVMモードとネイティブ・イメージ・モードの両方で、
Math.signum
、Math.copySign
Reference.refersTo
およびPhantomReference.refersTo
メソッドに対してコンパイラ組込み関数が追加されました。組込み関数によって、ネイティブ・メソッドが直接マシン・コードに置き換えられます。したがって、前述のJavaメソッドの組込み化により、ネイティブ・コールによるオーバーヘッドが排除され、パフォーマンスが大幅に向上します。たとえば、Reference.refersTo
とPhantomReference.refersTo
を組込み化することで、このGitHubの問題で報告されているパフォーマンス低下が修正されました。
GraalVM Community Editionでのコンパイラの変更箇所の完全なリストは、コンパイラの変更ログを参照してください。
ネイティブ・イメージ
- ネイティブ・イメージ構成の改善: リフレクション、JNI、クラス・パス・リソースおよび動的プロキシ・オブジェクトのイメージ・ビルド時に必要な構成ファイル・エントリを、クラスの到達可能性に基づいて条件付きにすることができるようになりました。これにより、さらに正確な構成が可能になり、ネイティブ・イメージのサイズを小さくできます。詳細や条件付きリフレクション構成の例は、ドキュメントを参照してください。
native-image
ビルダーによるリフレクション・メタデータ収集の改善: ネイティブ・イメージによって、問い合せられたリフレクション・メソッドと呼び出されたリフレクション・メソッドが区別されるようになりました。Class.getDeclaredMethods
(およびメソッドおよびコンストラクタを検索するための他のすべてのバリアント)をコールすると、すべてのクラスについて到達可能なすべてのメソッドが返されるようになりました。以前は、リフレクティブ呼出しに明示的に登録されたメソッドのみが返されていました。この新機能により、手動リフレクション構成が大幅に削減され、Method.invoke
を介して呼び出す必要があるメソッド、または到達可能性に基づいて到達可能とみなされないメソッドのみを、手動で登録する必要があります。問い合せられたリフレクション・メソッドと呼び出されたリフレクション・メソッドをこのように区別できるため、ネイティブ・イメージのファイル・サイズが小さくなります。-
大規模アプリケーションに対してイメージ・サイズを縮小してイメージ・ビルド時間を短縮する、いくつかの新しい最適化が追加されました。これは、いくつかのリリースで継続されている取組みです。次の表に、よく知られている大規模アプリケーションSpring petclinic-jdbcのイメージ・サイズとイメージ・ビルド時間を示します。数値は、Linux、AMD64、JDK 11、GraalVM Enterprise、spring-native 0.10.3を使用して開発者のノートPCで測定されています:
GraalVMバージョン イメージ・ビルド時間 イメージ・サイズ GraalVM 21.1 170秒 138MB GraalVM 21.2 163秒 133MB GraalVM 21.3 133秒 119MB - Javaプラットフォーム・モジュール・システムの初期サポートが追加されました:
native-image
ビルダーが、java
ランチャの既知のモジュール関連の引数(-m
、-p
、--add-opens
など)を受け入れるようになりました。そのようなモジュール関連の引数が使用されるとき、イメージ・ジェネレータ自体もモジュールとして使用されます。これは、イメージ・ジェネレータの動作の大きな変化です。モジュール・システムのさらに多くの要素をサポートするために開発が継続中です。この新機能を試したら、フィードバックやバグ・レポートをお送りください。 - 静的な
musl
ベースのネイティブ・イメージを作成してmusl.ccのmusl
ツールチェーンを使用する際のコンパイラの検索方法が変更されました。musl
ツールチェーンによって、静的ネイティブ・イメージの作成が大幅に簡略化されます。また、ツールチェーンを使用すると、動的にリンクされたmusl
ベースのイメージを作成するためにユーザー側で必要な変更は最小限になります。 - シリアルGCの新しいポリシーが追加され、実行時にアプリケーションのメモリー・フットプリントが削減されるようになりました。新しいポリシーによって、若い世代のSurvivor領域が有効になります。これは、しばらく前からコードセットに存在していたがデフォルトでは有効になっていなかった機能です。また、フルGCでは、ルート・ポインタについてイメージ・ヒープ全体をスキャンしなくなり、書き込まれたイメージ・ヒープの一部のみをスキャンするようになりました。新しいポリシーは、デフォルトでは有効になっていません(次回のリリースで計画されています)。
-H:InitialCollectionPolicy=Adaptive
を使用して有効にできます。新しいポリシーをテストし、不具合があれば次のリリースの前に対処できるようにレポートしてください。 - 静的分析の正確性が改善されました: 静的分析の前に小規模なメソッドがインライン化されるようになりました。これにより、定数畳込みが改善され、予期しない事態が減少します。たとえば、以前、静的最終フィールドに直接アクセスしていたコードは、アクセサ・メソッドを介して静的最終フィールドにアクセスしたコードとは異なる方法で最適化されていました。
void foo() { if (MyConfiguration.WINDOWS) { // The static analysis does not see this code as reachable on non-Windows platforms. } } static boolean isWindows() { return MyConfiguration.WINDOWS; } void bar() { if (isWindows()) { // The static analysis marked this code as reachable because the method invocation prevented constant folding before the static analysis. With method inlining before static analysis enabled now, this code is no longer seen as reachable on non-Windows platforms. } }
- ネイティブ・イメージ・ジェネレータへの引数を、
@argument
オプションで指定される別のファイルで渡すことができるようになりました。これは、コマンドラインの長さが制限されているWindowsなどのプラットフォームにとって必要な回避策です。 - ルート証明書が、イメージの実行時に構成できるようになりました。以前は、イメージ・ビルド時に存在していたルート証明書が、実行時に使用可能な唯一のルート証明書でした。詳細およびルート証明書を構成するために実行時に読み取られるようになったシステム・プロパティのリストは、ドキュメントを参照してください。
- segfaultまたは致命的なVMエラーの発生時に出力されるクラッシュ・ダンプに含まれる詳細情報が増え、診断に役立つようになりました。また、イメージ・ヒープの先頭が保護メモリーになったため、nullポインタのアクセスによって、ランダム・メモリーのアクセスではなくsegfaultが発生するようになりました。無効な仮想メソッド表エントリがアクセスされた内部VMエラーの場合に、わかりやすいクラッシュ・ダンプが生成されるようになります。
- Linuxでは、実行時にレポートされるプロセッサ数で、
cpuset
によって設定される制限が考慮されるようになりました。 - Dwarfデバッグ情報の生成が改善され、インライン化されたメソッドの情報を含むようになりました(Red Hatによって提供)。
- JDK Flight Recorder (JFR)のサポートがJDK 17ベースのGraalVMでも提供されるようになりました(Red Hatによって提供)。
ポリグロット・ランタイム
- 試験段階のエンジン・キャッシュ機能の安定性と性能が改善されました。詳細は、ドキュメントを参照してください。
- すべてのポリグロット言語での組込みCPUサンプラ・ツールの操作性が改善されました(
--cpusampler
オプションを参照してください)。- 新しいゲスト言語のセーフポイント・メカニズムを使用して、サンプリング出力の精度が向上しました。サンプリング出力には、コンパイル単位だけでなくインライン化されたメソッドがデフォルトで示されるようになりました。
- デフォルト・サンプリング・ヒストグラムの出力が簡素化され、各最適化層にかかった時間を表示するための
--cpusampler.ShowTiers
オプションが追加されました。 -
SVGフレームグラフ出力形式がCPUSamplerに追加されました。これを有効にするには、オプション
--cpusampler.OutputFormat=flamegraph
を使用します。
Java on Truffle
- Java 17のゲストとホストのサポートが追加されました。
- Java on Truffleで、相互運用性バッファのようなオブジェクトを
byte[]
として使用するためのサポートが有効になりました。「相互運用性API javadoc」のバッファ要素の項を参照してください。 - 明示的な相互運用性APIに対するバッファ相互運用メッセージのサポートが追加されました。
- ポリグロットAPIは、デフォルトでは有効でなくなりました。必要に応じて、
java.Polyglot
オプションをtrue
に設定してコンテキストを作成する必要があります。 - HotSwap APIは、デバッグによって自動的に有効化されないようになりました。必要に応じて、
java.HotSwapAPI
オプションをtrue
に設定してコンテキストを作成する必要があります。 - ホストのJava 11以降での不正なリフレクティブ・アクセス警告を回避するために最適化が追加されました。
プロジェクトの変更ログをGitHubで参照できます。
JavaScript
- Node.jsがバージョン14.17.6に更新されました。Node 14.xがサポート期限を迎えるとGraalVM Node.jsのサポートは終了します(「Node.jsリリース・スケジュール」を参照)。
- エラー原因の提案が実装されました。これは、試験段階のオプション
--js.error-cause
の後で使用できます。 - アサーションのインポートの提案が実装されました。これは、試験段階のオプション
--js.import-assertions
の後で使用できます。 Object.hasOwn
(アクセス可能なObject.hasOwnProperty提案)が実装されました。これは、ECMAScript 2022 (--js.ecmascript-version=2022
)で使用できます。- クラス静的初期化ブロックおよび
in
のプライベート・フィールドのサポートが実装されました。ECMAScript 2022 (--js.ecmascript-version=2022
)で使用できます。 - 試験段階のポリグロット
Context
オプション--js.esm-eval-returns-exports
が追加されました(デフォルトでは無効です)。有効にすると、ESモジュールのeval()
によって、エクスポートを含むポリグロットValue
が返されます。 - WebAssemblyの完全性とパフォーマンスに関するいくつかの修正が追加されました。JavaScript BigIntとWebAssembly i64の統合の提案が含まれます。
プロジェクト・リポジトリ内の変更ログが使用可能です。
Ruby
- TRegexがデフォルトで使用されるようになりました。正規表現を照合する速度が大幅に向上します。
- ポリグロット・モードでの外部オブジェクトの特徴(配列、ハッシュ、反復可能など)に対するサポートが完全に統合され、Rubyと同様に動作するようになりました。
- ExecJS gemで使用される透過的な内部コンテキストのサポートが追加されました。
- Ruby 2.7.4が更新され、CVE-2021-31810、CVE-2021-32066およびCVE-2021-31799が修正されました。
変更の完全なリストは、changelogを参照してください。
Python
- C拡張機能エミュレーション・レイヤーから
PYPY_VERSION
が削除されました。つまり、C拡張機能に対してPyPyを装わなくなり、PyPy固有のハックを回避できます。このため、PyGameパッケージがそのままで動作できるようになります。 - コア言語の組込みや最適化がさらに行われ、起動が速くなりフットプリントが減少しました。
- HPy 0.0.3のバイナリ互換バックエンドが実装されました。これによりHPyパッケージをCPythonおよびGraalVM Python上で変更せずに実行できるようになりました。これは、ユーザーがGraalPython用にコンパイルしなくても使用できるパッケージを増やすための継続中の取組みの一部です。
- プロセス内のネストされたコンテキストを介した
multiprocessing
モジュールのサポートが追加されました。これによって、マルチプロセッシングに対応するように、共通のPython機能を使用して、同じプロセス内の複数のコアでの実行が可能になります。 ctypes
モジュールのサポートが追加され、ctypes APIを使用する多くのネイティブ拡張機能の実行が可能になりました。- Githubで報告されたREPLに関する複数の問題が修正されました。ユーザーがREPLでコードのブロックを正しく貼り付け、数値入力キー・パッドを使用できるようになりました。
- マーシャリング形式がCPythonと互換性を持つようになりました。これにより、CPythonプロセスとGraalVM Pythonプロセスの間でオブジェクトを交換できます。
- ほとんどの
socket
モジュール・テストがネイティブ・モードで合格したため、すべてのPOSIXソケットAPIを使用できるようになりました。以前はJava機能でサポートされるものしか使用できませんでした。これには、Unixドメイン・ソケットやソケットのメッセージAPIなどが含まれます。 - 様々な互換性の修正が追加され
psutil
パッケージが動作するようになりました。
プロジェクトの変更ログをGitHubで参照できます。
R
- PCREからPCRE2バージョン10.37にアップグレードされました。一部のUnicodeパターンおよびテキストはまだサポートされていません。ユーザーが認識する可能性のあるPCREとPCRE2の違いの詳細は、GNU-Rの変更ログ(PCRE2への移行に関する項)を参照してください。
- 操作性の向上とバグ修正がいくつか追加されました:
- R拡張機能のビルド時に使用される暗黙のルール作成パラメータが修正されました。
- R拡張機能での
CHARSXP
オブジェクトの予期しないガベージ・コレクションが修正されました。FastRでは、文字ベクトルの内部表現がGNU-R互換のCHARSXP
オブジェクトにマテリアライズされませんでした。このため、STRING_ELT
によって返されるCHARSXPオブジェクトの予期しないコレクションが引き起こされました。 - 起動時にユーザーのプロファイルを無視するオプション
--no-init-file
は、現在、予期したとおりに動作するようになりました。 stats
パッケージの関数approx
およびapproxfun
が修正され、エラー・メッセージ「引数の数が正しくありません」で失敗しないようになりました。
プロジェクトの変更ログをGitHubで参照できます。
LLVMランタイム
- C/C++をコンパイルするためのLLVMツールチェーンがバージョン12.0.1に更新されました。
- 「管理対象モード」と「ネイティブ・モード」のコードに関係するコードベースのモジュラ化が改善されました。これによって、これら2つのモード間の静的ビルドの依存関係が減少し、管理されないメモリー・アクセスがすべて削除されることで、同時に管理対象モードのコードベースの堅牢性が向上します。
プロジェクトの変更ログをGitHubで参照できます。
WebAssembly
- GraalVM WebAssemblyの内部実装が改善され、JS-WebAssemblyインタフェースAPIのコンプライアンスが向上しました。
- GraalVM WebAssemblyに対する可変グローバルのインポートとエクスポートのサポートが追加されました。これは、可変グローバルのインポート/エクスポートの提案に関するページで定義されています。
- モジュール検証チェックが前のステージに移動されました。これにより、モジュールは、リンクおよびインスタンス化の際に検証されるのではなく、解析時に完全に検証されます。ポリグロットAPIの
Context#eval
が呼び出されたとき、および同様にJS-WebAssemblyインタフェースAPIのWebAssembly.validate
が呼び出されたときに、すべての検証エラーが適切にレポートされるようになりました。 - メモリーが増加したとき(
mem_grow
命令の実行時)のJavaScriptへの通知が追加されました。これにより、JS-WebAssemblyインタフェースAPIのコンプライアンスが向上します。 - GraalVM WebAssemblyの相互運用性オブジェクトが変更され、JS-WebAssemblyインタフェースでのオブジェクトのキャッシュが許可されました。
- JS-WebAssemblyインタフェースAPIに
BigInt
からi64
への変換のサポートが追加されました。
変更の完全なリストは変更ログを参照してください。
ツール
Visual Studio Code
いくつかのリファクタリングがGraalVM Extension Pack for Javaに追加されました。これらは次のとおりです:
- 静的インポートへの変換
- インタフェースまたはメソッドの抽出
- ローカル変数の抽出
- 変数への割当て
hashCode
およびequals
の生成toString()
の生成- メソッド・シグネチャの変更
- 名前変更
- メンバーのプル・アップ
- クラスの移動
for
サイクル、while()
サイクル、try-catch
、switch()
文のリファクタリング
GraalVM Tools for Java拡張機能
-
GraalVM Tools for Java拡張機能によって有効になったVS Codeでのネイティブ・イメージのデバッグが大幅に改善されました。デバッガをネイティブ・イメージ・プロセスにアタッチして、イメージの実際のコードにステップ・オーバーできるようになりました:
yum
などのホストOSユーティリティによってインストールされたGraalVMを追加する機能が実装されました。その後、コンポーネントは同じユーティリティによって端末から管理する必要があります。-
VS Codeネイティブ・テスト・エクスプローラAPIおよびUI拡張機能を利用できるようになりました。
-
条件付きブレークポイントの設定が有効になりました:
- Groovy言語機能が、GroovyファイルまたはSpockテストを含むJavaプロジェクトで使用できるようになりました。たとえば、
CodeCompletion
が機能しており、Spockテストをデバッグして実行できます。スタンドアロンのGroovyスクリプトの実行はサポートされていません。
GraalVM Tools for Micronaut拡張機能
Kubernetesのサポートが追加されました: MicronautアプリケーションをVS CodeからKubernetesクラスタに直接デプロイし、実行やデバッグを行えるようになりました。
-
Micronautサポートのために「Create Kubernetes Deployment Resource」、「Run in Kubernetes」、「Deploy in Kubernetes」クイック・アクションが有効になりました:
-
Kubernetesデプロイメントの作成時に使用されるDockerイメージを選択できるようになりました:
-
Dockerレジストリのシークレットを選択できるようになりました:
「Micronaut: Deploy to Kubernetes」アクションを呼び出すと、Javaプロジェクトがパッケージ化され、Dockerイメージがビルドされてコンテナ・レジストリにプッシュされます。デプロイメントがKubernetesクラスタに作成され、ローカル・ポートがポッドで実行されているアプリケーションに転送されます。
デプロイされると、Kubernetes拡張機能を使用してKubernetesノードをデバッグできます。開発しているノードを選択し、「Debug (Attach using Java 8+)」アクションを呼び出すこともできます。
ポリグロット埋込み
- コンテキスト間で値を共有する機能が追加されました。詳細は、
Context.Builder.allowValueSharing(boolean)
を参照してください。この更新によってこのGitHubの問題が対処されました。 - ポリグロットAPIが改善され、ゲストからホストへのコールバックでのスコープ値のサポートが追加されました。スコープ値は、コールバックが戻ると自動的に解放されます。これらは
HostAccess
で構成できます。
変更の完全なリストは変更ログを参照してください。
Truffle言語およびツールの実装の更新
- オブジェクトのレイアウトを表す新しい静的オブジェクト・モデルAPIが追加されました。このオブジェクトは定義されると、プロパティの数やタイプが変更されません。これは、特に静的プログラミング言語のオブジェクト・モデルの実装に適していますが、これに限定されるわけではありません。詳細は、Javadocおよびチュートリアルを参照してください。
BytecodeOSRNode
インタフェースが追加され、バイトコード・インタプリタのスタック上置換(OSR)がサポートされるようになりました。OSRでは、実行の最中に解釈されたコードからコンパイルされたコードに切り替えることで、起動時のパフォーマンスを向上させることができます。これは、長時間実行ループを含むターゲットで特に有効です。OSRなしではインタプリタ内で実行が「スタックする」可能性があるためです。詳細は、JavadocおよびOSRガイドを参照してください。- 言語およびコンテキストの参照が、静的最終フィールドに格納できるようになりました。新しい使用方法の詳細は、javadocを参照してください。すべてのスレッド・ローカル参照が、HotSpotおよびSubstrateVMに対して、効率的な実装(解釈されたものとコンパイルされたもの)を保持するため、AST内の値をキャッシュする必要がなくなります。
- FrameInstance#getCompilationTierおよびFrameInstancel#isCompilationRootが追加されました
TruffleContext.evalPublic(Node, Source)
およびTruffleContext.evalInternal(Node, Source)
が追加されました。内部コンテキストのソースを評価して、内部コンテキストの値に安全にアクセスできるようになります。--engine.TraceDeoptimizeFrame
が追加され、FrameInstance#getFrame(READ_WRITE|MATERIALIZE)
によるフレームの脱最適化をトレースできるようになりました。TruffleContext.evalPublic(Node, Source)
およびTruffleContext.evalInternal(Node, Source)
が追加されました。内部コンテキストのソースを評価して、内部コンテキストの値に安全にアクセスできるようになります。- 内部コンテキストを作成した言語の初期化を無効にできる
TruffleContext.Builder.initializeCreatorContext(boolean)
が追加されました。 Node
のexecute
メソッドへのコールをトレースできるExecuteTracingSupport
インタフェースが追加されました。
変更の完全なリストは変更ログを参照してください。
Oracle GraalVM Enterprise Edition 21.2.0.1
(2021-08-04)
これは、GraalVM 21.2.xブランチのホットフィックス・リリースです。これには、次のような操作上の修正が含まれます:
- 特殊文字解析を改善するために、Java 11ベースのGraalVMで
StringBuilder
最適化の問題が修正されました(#3627を参照)。 date
C拡張で使用されるstrspn
は古いglibc
ではマクロとしてコンパイルされるため、新しいglibc
では__strspn_c1
シンボルが見つからないという問題が修正されました(#2406を参照)。
Oracle GraalVM Enterprise Edition 21.2.0
(2021-07-20)
- Javaおよびコンパイラの更新
- プラットフォームの更新
- ネイティブ・イメージ
- ポリグロット・ランタイム
- Java on Truffle
- JavaScript
- WebAssembly
- LLVMランタイム
- Ruby
- Python
- R
- ツール
- ポリグロット埋込み
- Truffle言語およびツールの実装
Javaおよびコンパイラの更新
GraalVM Enterprise EditionのビルドのベースとなるOracle JDKリリースは、次のように更新されました:
- 8u301 (Java 8ベースのGraalVM Enterprise用、Java SE 8リリース・ノートを参照)
- 11.0.12 (Java 11ベースのGraalVM Enterprise用、Java SE 11リリース・ノートを参照)
-
16.0.2 (Java 16ベースのGraalVM Enterprise用、Java SE 16リリース・ノートを参照)
- カウント・ループのループ制限分析が改善されました。コンパイラは、先行する条件を考慮に入れて、誘導変数の範囲を検出して絞り込むようになりました。ループがカウントされると、部分的なアンロール、反転、ベクトル化などの高度な最適化で修正できるようになります。
- シーケンシャル・コード用に新しいSIMD (単一命令複数データ)ベクトル化の最適化が追加されました。この最適化は、21.3リリースまでデフォルトで無効になっています。
-Dgraal.VectorizeSIMD=true
で有効にします。 - 非カウント・ループに、新しいストリップ・マイニングの最適化が追加されました。ストリップ・マイニングはデフォルトで無効になっています。
-Dgraal.StripMineNonCountedLoops=true
オプションで有効にします。 - 既存の
StringBuilderOptimizationPhase
は、StringBuilder
パターンで高レベルの変換を実行して、最終的なString
を直接構築し、不要な中間Strings
およびStringBuilders
を排除します。このリリースでは、JDKで使用される簡潔なString
表現のサポートを追加して、この最適化のサポートをJDK11に追加します。コア最適化が改善され、より多くのコード・シェイプの処理、およびより多くの操作の定数畳込みが可能になりました。 - 長いカウント・ループでのセーフポイントの排除が改善されました。コンパイラは、
long
誘導変数(int
ではなく)を持つループ内のセーフポイントを排除できるようになりました。この場合、以前はint
型誘導変数のみを考慮していましたが、誘導変数の範囲(つまり、反復の最大数)がInteger.MAX_VALUE - Integer.MIN_VALUE
であることを静的に証明できます。 - 「書込みシンキング」と呼ばれるループから書込みを移動しようとする最適化が追加されました。書込みシンキングは、デフォルトでは無効な試験段階の機能です。
-Dgraal.OptWriteMotion=true
で有効にします。 - ループ内のループ不変ガード(配列境界チェックなど)をループ外に移動しようとする投機的ガードの移動の最適化を実装しました。この変更により、SpecJVM2008のGraalVMコミュニティの幾何平均スループット・スコアが4.2%向上します。Renaissance、DaCapoおよびScalaDacapoベンチマークのスコアも、約0.5%増加します。
-Dgraal.SpeculativeGuardMovement=false
で無効にします。 - C2で行われた内容と同様に、
Reference.refersTo
およびPhantomReference.refersTo
の組込みが追加されました。 - ループ条件によって最初の反復が保護されない
do
/while
ループにカウント・ループ最適化を適用するためのサポートが追加されました。 - Ahead-of-Timeコンパイル・フロー(GraalVMネイティブ・イメージ)に参加する必要があるガード・ホイスティング・ループ複製フェーズが追加されました。これは、特定のループを「高速」および「低速」バージョンに分割します。実行時に例外が発生しないことがわかっている場合は、高速ループが選択されます。高速ループにより、ループの最適化とループのベクトル化が向上します。ループの複製には、プロファイルに基づく最適化データが必要です。
-H:-GuardHoistingLoopDuplication
で無効にします。 - Graalコンパイラが向上し、64を超えるループを含むメソッドの事前コンパイルを実現しました。これにより、ネイティブ・イメージがメソッド本体に64を超えるループを持つプログラムをコンパイルできなかった問題が解決されます。これは、ANTLRなどのツールによる出力など、生成されたJavaコードによく見られるパターンです。
プラットフォームの更新
- Linux AArch64: AArch64 CPUアーキテクチャのGraalVMディストリビューションは、21.2でサポートされており、RubyランタイムやJava on Truffle (Espresso)などの多くの機能が有効になっています。
- Java 16のサポート: Oracle JDK 16またはOpenJDK 16に基づいて構築されたGraalVMには試験的な部分が残っていますが、既知の制限を克服し、Ruby、PythonおよびWebAssemblyランタイムのサポートを追加して、より「成熟」しています。
ネイティブ・イメージ
- JUnit 5の初期テスト・サポートにより、ネイティブ・イメージの新しい正式なGradleおよびMavenプラグインをリリースしました。これらのプラグインにより、ネイティブの実行可能ファイルとしてのJavaアプリケーションの構築、テストおよび実行が格段に容易になり、ネイティブのJUnitサポートにより、JVMライブラリはGraalVMネイティブ・イメージを介してテスト・スイートを実行できます。詳細は、お知らせのブログ投稿を参照してください。
- JDK 11の基本的なJavaフライト・レコーダ(JFR)サポートが追加されました。この機能は、オラクル社とRed Hat社の連携で開発されました。
-H:+AllowVMInspection
を使用して構築されたネイティブ・イメージは、Javaで記述されたJFRイベントをサポートします(jdk.jfr.Event
を参照)。JFRイベントを実行時に記録するには、JFRサポートおよびJFR記録を有効にする必要があります。ドキュメントを確認するか、-XX:+FlightRecorder
および-XX:StartFlightRecording
オプションのヘルプ・メッセージを参照してください。現時点では、JFRサポートは依然として大幅に制限されています。つまり、ほとんどのVM内部イベントや、スタック・トレースやメモリー・リーク検出などのほとんどの高度な機能も不足しています。 - リソース処理の向上: イメージに格納されているリソースに仮想ファイル・システムからアクセスできます。
- クラス事前定義を実装: 実行時に
ClassLoader.loadClass
をサポートするには、実行時にロードする必要があるクラスを静的分析で使用可能にして、クローズワールド分析に含めることができます。これにより、実行時にロードまたは生成されたクラスが安定しているかぎり、動的クラスのロードに依存するライブラリとの互換性が向上します。この機能は、オラクル社とAlibaba社の連携で開発されました。 - イメージから不要なセキュリティ・プロバイダを削除しました。アクセス可能なセキュリティ・プロバイダは静的分析によって自動的に検出されます。場合によって、アクセス可能なプロバイダが多すぎるため、イメージのサイズが大きくなり、非決定的となるというバグが修正されました。また、
-H:-EnableSecurityServicesFeature
を使用して自動検出を完全に無効にすることもできるようになりました。 - ガベージ・コレクタなしでイメージを構築する「epsilon」GCが追加され、これは少量のメモリーのみを割り当てる、実行時間が非常に短いアプリケーションに適用されます。最大ヒープ・サイズを超えて割り当てられると、アプリケーションは失敗します。
--gc=epsilon
を使用して、イメージのビルド時に有効にします。 --initialize-at-build-time
オプションの動作を引数でのみ使用するように変更しました。これにより、ユーザーは作成不可のコードを記述できなくなり、偶発的なセマンティック・エラーを回避できます。
ポリグロット・ランタイム
- デフォルトで有効な新しいコンパイル・キューイング・ヒューリスティックが追加されました。新しいヒューリスティックにより、多くのワークロードでポリグロット・ランタイムのウォームアップ時間が改善されます。現在実行中のコードを検出し、そのようなコードのコンパイルに優先順位を付けます。また、新しいキュー実装は、コンパイル・キューの負荷に応じてコンパイルしきい値を増減する、動的コンパイルしきい値も使用します。新しいヒューリスティックは、
--engine.TraversingCompilationQueue=true|false
を使用して有効または無効にできます。新しいヒューリスティックの詳細は、こちらを参照してください。 - VM検査がすべてのランチャでデフォルトで有効になりました。検査を可能にするために言語ランチャ・イメージを再ビルドする必要はなくなりました。
SIGQUIT
シグナルを使用して、スレッド・ダンプの実行中はいつでも出力できるようになりました。さらに、GraalVM Enterpriseで--vm.XX:+UsePerfData
オプションを使用してパフォーマンス・カウンタを有効にすることで、VisualVMは、native-image
で実行される言語ランチャをアタッチおよびモニターできます。
Java on Truffle
- Truffle on Javaホットスワップ・プラグインAPIが導入され、実行中のアプリケーションを再起動することなくコードをリロードできるようになりました。これは、注釈、実装されているサービスやBeanなどのフレームワーク固有の更新などの変更をフレームワーク開発者が反映させるためのものです。詳細は、ドキュメントを確認してください。
- バイトコードのディスパッチが改善され、インタプリタが15-30%高速化しました。
- 実行時にホスト・クラスを動的に生成する新しい静的オブジェクト・モデル実装が追加されました。現時点でこれは試験段階です。
- 外部スレッドがEspressoに入り、ネイティブ・コードを呼び出すときにクラッシュしないように修正が追加されました。
- 古いバージョンのGNU libc (<= 2.17)で実行するときのクラッシュが修正されました。
Map
、Map.Entry
、List
、Iterator
またはIterable
を実装するゲスト・オブジェクトに対する追加の相互運用性メッセージのサポートが追加されました。
JavaScript
- ランタイム・コンパイルがサポートされていない場合は、GraalVM JavaScriptによって警告が出力されるようになりました。この警告は、
-engine.WarnInterpreterOnly=false
オプションまたは-Dpolyglot.engine.WarnInterpreterOnly=false
システム・プロパティを使用して無効にできます。 js.unhandled-rejections
オプショが追加され、ポリグロットContext
での未処理の回答拒否を追跡します。デフォルトでは、このオプションはnone
に設定され、未処理の回答拒否は追跡されません。- 新規setメソッド提案が実装されました。これは、試験段階フラグ(
--js.new-set-methods
)の後で使用できます。 - 試験段階演算子の多重定義のサポートを実装しました。試験段階オプション
--js.operator-overloading
を使用して有効にし、ドキュメントを参照してください。 d
フラグを使用して、RegExp一致インデックス提案をオプトインで更新しました。ECMAScript 2022 (-js.ecmascript-version=2022
)で使用できます。-js.regexp-match-indices
オプションが非推奨になりました。
プロジェクト・リポジトリ内の変更ログが使用可能です。
WebAssembly
- GraalVMのWebAssemblyは、メモリー割当て障害を正しく検出し、内部エンジン・エラーを返すかわりに、仕様(
RangeError
例外)に従ってWebAssemblyエラーをスローするようになりました。 - インポートされた表から関数を呼び出す際のエッジケースが修正されました。間接コール(
call_indirect
命令)では、関数が別のモジュールからエクスポートされ、インポートした表にエントリとして設定されるときに、GraalWasmにより関数タイプが正しく入力チェックされるようになりました。 - 算術エラーの検出が改善され、より具体的なタイプの算術例外が出力されます。以前のバージョンでは、特定の算術エラーを処理すると
NullPointerException
が発生していました。 - WebAssemblyを使用するNPMモジュールができるだけ多くテストに合格するために、一般的な保守作業を実施し、バグを修正しました。
LLVMランタイム
- [GraalVM Enterprise]
pthread_create
、pthread_exit
、pthread_join
、pthread_mutex
、pthread_rwlock
、pthread_cond
など、管理モードでのpthreads
およびpthread
同期プリミティブのサポートが追加されました。これにより、ユーザーはマルチスレッド・プログラムを実行できます。以前は、ユーザーがマルチスレッド・ソフトウェアを実行しようとすると失敗していました。 - [GraalVM Enterprise]
musl libc
がバージョン1.2.2に更新されました。 - 言語間の相互運用性によるC++仮想コールのサポートが追加されました。
- 既存のアセンブリ命令のアトミック・バージョンのサポートが追加されました。これは、LLVMランタイムがインライン・アセンブリ(特にマルチスレッド・ソフトウェア用)を幅広くサポートするようになったことを意味します。
- MacOS 11.3のC++で正しく機能しないGraalVMのLLVMツールチェーンが修正されました(#3383を参照)。
プロジェクト変更ログはGitHubで使用可能です。
Ruby (TruffleRuby)
- 名前ごとおよびクラスごとの仮定を使用して、Rubyのメソッドおよび定数の正確な無効化を実装しました。
- Ruby 2.7.3に更新されました(CVE-2021-28965およびCVE-2021-28966を修正)。
resolv
stdlibは更新されませんでした(2.7.3のresolv
にはバグがあります)。 - macOS 10.13でのLLVMツールチェーンの問題が修正されました(#3383を参照)。
#dig
メソッドが改善され、配列およびハッシュによる反復が速くなり、3つ以上の引数を持つコールでコンパイルが向上しました(#2301を参照)。- 同期化を減らすことでファイバローカル変数を改善し、高速化しました。
TruffleSafepoint
がカスタム・ロジックのかわりに使用され、ゲスト・セーフポイント(Thread#{backtrace,raise,kill}
、ObjectSpace
など)のJIT主導コードが無効ではなくなりました。
変更の完全なリストは、changelogを参照してください。
Python
- [GraalVM Enterprise]純粋なPythonバージョンより高速なバージョンとして
_pickle
を実装しました。GraalVM Enterpriseのユーザーは、ネットワーク全体でオブジェクトをシリアライズするときのパフォーマンスの向上を確認できます。 - 高速パスの追加、機能の組込み、共通データ構造用の最適化された表示の追加によって、ウォームアップおよび共有エンジン構成でのPythonパフォーマンスが特に向上しました。
- より効率的なGILリリース、信号ハンドラ、および弱い参照コールバックのために、新しいTruffleセーフポイント・メカニズムを適用しました。
- サポートされるHPyバージョンを0.0.2に更新しました。
- 新しいハッシュ相互運用性メッセージを使用した
dict
タイプのサポートが適切に追加されました。現在、Pythonディクショナリはjava.util.Map
にキャストでき、JavaのPythonを使用するときに想定どおりに動作します。 - GraalVM Pythonランタイムは、
socket
、OrderedDict
およびtime
のio
、crypt
および多くの機能に対する互換性テストに合格しています。これらを使用するPython 3.8用に記述されたコードは、現在より適切に動作することが予想されています。 - システム・アクセスおよびプロセスのモニターを可能にする
psutil
パッケージ、およびビデオ・ゲームの記述用に設計されたPyGame
モジュールの初期サポートが追加されました。 - GraalVMのPythonは、現在の作業ディレクトリにファイル名sitecentedize.pyが存在する場合、無条件で
_pycache_
を作成しなくなりました。
詳細は、変更ログを参照してください。
R
- R 4.0.3との互換性は継続的に改善されています。たとえば、
rlang
0.4.10、vctrs
3.6、tibble
3.0.6およびtestthat
3.0.1パッケージのサポートは大幅に改善されました。 - 既知の問題があるパッケージ(
dplyr
1.0.3、ggplot
3.3.3およびknitr
1.31)はまだ残っています。
詳細は、プロジェクト変更ログを参照してください。
ツール
Visual Studio Code
- 次のようにVS Codeの拡張機能名を変更しました:
- GraalVM Tools for Java
- GraalVM Extension Pack for Java
- GraalVM Tools for Micronaut
GraalVM Tools for Java拡張機能
- JDK16とその言語機能の完全なサポートを実装しました。
- JDK8以降でサポートされる単一のJavaクラスの開発、実行およびデバッグのサポートが追加されました。
-
新しいJavaプロジェクトを簡単に作成するためのウィザードが導入されました:
-
様々なJavaおよび関連ファイルをプロジェクトに追加できる新しいクラス・ウィザードJava: テンプレートから新規作成が導入されました:
-
実行中のプロセスにデバッガをアタッチできるようになりました。Java 8+...構成の実行およびデバッグで使用できます。
- GoTo型、「使用状況を検索」オプションにより、Javaコード・ナビゲーションを改善しました。
-
ネイティブ・イメージ・エージェントが、「デバッガなしで実行」モードで構成データを収集できるようにしました。これにより、VS Codeからネイティブ・イメージを簡単にビルドできます。特別な起動構成ネイティブ・イメージ・エージェントを使用したJava 8+アプリケーションの起動を使用します。詳細は、この機能のドキュメントを参照してください。
GraalVM Tools for Micronaut拡張機能
-
GradleおよびMavenプロジェクト用の「Devモードの実行」とも呼ばれる「Javaの起動: 連続モード」起動構成が追加されました:
-
Groovy言語でのSpockテストを開発および実行しました。コード補完およびGroovyの他の編集サポートが含まれています。
VisualVMとVS Codeの統合
- アクティブなGraalVMインストールに含まれるVisualVMツールを制御するためのVS Code Grアクティビティに特別なセクションが追加されました。詳細はこの機能のドキュメントで参照できますが、主な更新は次のとおりです:
- VS CodeプロジェクトとともにVisualVMの起動を可能にしました
- スレッドまたはヒープ・ダンプの取得、およびCPU/メモリー・サンプリングおよびJFR記録の構成および制御のためのアクションを提供します
- ソースをVS Codeで再度開くVisualVMビューで「ソースへ移動」アクションを有効にしました
VisualVM
- ライブ・プロセスからのJFR記録の保存を可能にする機能が追加されました(#297を参照)。
- 「プロファイラ」タブに「ロック内容」ビューを追加して、ロック競合プロファイル機能を実装しました(#298を参照)。
- JDK 17のサポートが追加されました。
- コマンドラインまたは外部ツールからVisualVMインスタンスを制御できるようにします。つまり、端末からサンプリングの開始(#321)、フライト記録の制御(#322)、スレッドの取得(#319)、またはJavaプロセスのヒープ・ダンプ(#320)を行えます。
- VisualVMのMavenアーティファクトを公開しました。
ポリグロット埋込み
このリリースのポリグロット埋込みに必要なJVMCIバージョンを更新しました。すべてのGraalVM JDKバージョン(8、11、16)には、更新されたJVMCIバージョンがすでに含まれており、それ以上のアクションは必要ありません。GraalVMとは異なるJDKを使用しており、アップグレード・モジュール・パスにGraalコンパイラを構成した場合は、完全な互換性のためにJDK-8264016を含む次のJDKバージョンのいずれかが必要です:
- その他のJDK 11: Oracle JDK 11.0.13 (2021-10-19)、OpenJDKはまだ決定されていません。
- その他のJDK 16: JVMCIを更新する現在の計画はありません。
- その他のJDK 17: 新しいJVMCIバージョンは、初期アクセス・ビルドにすでに統合されています。
JVMCIのバージョンが古い場合は、GraalVM埋込みを使用できますが、強制的なコンテキスト取消し(Context.close(true)
)および中断(Context.interrupt(Duration)
)によってエラーがスローされます。次の回避策をお薦めします:
- 強制的なコンテキスト取消しまたは中断を使用しないでください。他のすべての機能は引き続きサポートされます。
- upgrade-module-pathからgraal.jarを削除して、フォールバック・ランタイムに切り替えます。これはパフォーマンスを大幅に悪化させ、最後の手段にしかならないことに注意してください。
- JDKバージョンが新しいJVMCIバージョンをサポートするまで、21.2にアップグレードして待機します。
その他の変更:
Value.as(TypeLiteral<Function<Object, Object>>).apply()
の動作が変更されました。関数がObject[]
引数でコールされると、引数の配列ではなく単一の引数として渡されます(#456を参照)。
変更の完全なリストは、こちらを参照してください。
Truffle言語およびツールの実装
- Truffleライブラリのサポートを追加して、前もって実行することなくAhead-of-Timeコンパイルできるようにしました。詳細は、ExportLibrary.useForAOTまたはAOTチュートリアルを参照してください。
DebugValue
メソッドhashCode()
およびequals()
を実装して、対応するゲスト・オブジェクトに対する相互運用性identityHashCode
およびisIdenticalコールの結果をそれぞれ提供します。DebugValue
にイテレータおよびハッシュ・マップのサポートが追加されました。追加されたメソッドは、それぞれのInteropLibrary
メソッドに委任されます。- Truffle特殊化DSLの
@Fallback
注釈が付いたメソッドは、@Cached
、@CachedContext
、@CachedLanguage
、@Bind
およびディスパッチされた@CachedLibrary
パラメータをサポートするようになりました。 - Truffleコンテキストの実行を一時停止および再開するために、
TruffleContext.pause()
およびTruffleContext.resume(Future<Void>)
がそれぞれ追加されました。 - ベンチマークに役立つ
CompilerDirectives.blackhole(value)
が追加されました。 - コンテキスト破棄時の自動クローズのために
Closeable
を登録するTruffleLanguage#Env.registerOnDispose(Closeable)
が追加されました。 RootNode#countsTowardsStackTraceLimit()
を追加し、指定されたルート・ノードのフレームがスタック・トレース制限に対してカウントされるかどうかを決定する基準としてRootNode#isInternal()
を置き換えました。- メモリーの順序をきめ細かく制御するためのメソッドを提供する
MemoryFence
が追加されました(#2031を参照)。 ValueProfile.createEqualityProfile()
は置換えなしで非推奨となりました。Object.equals(Object)
は、コンパイル済コード・パスでは安全に使用できません。かわりにTruffle特殊化DSLを使用して、同等のセマンティクスを持つキャッシュを実装します。Object.equals(Object)
をランタイム・コンパイル・メソッドとしてアクセス可能にすると、ネイティブ・イメージのランタイム・コンパイルにアクセスできる同等の実装の数が多くなりすぎます。ArityException
インスタンスで想定される引数範囲をサポートするメソッドが非推奨となり、追加されました。後継のメソッドには、より厳密な検証が含まれるようになりました。@Shared
および@Cached
パラメータがNULL以外の値を返し、ガードで使用される場合、特殊化DSLによりAssertionError
をスローするコードが生成されるようになりました。null状態は初期化されていない状態のために予約されています。LoopConditionProfile#create()
がcreateCountingProfile()
の別名として追加され、@Cached LoopConditionProfile loopProfile
のように使用できるようになりました。
変更の完全なリストは、こちらを参照してください。
Oracle GraalVM Enterprise Edition 21.1.0
(2021-04-20)
Javaの更新
GraalVM Enterprise EditionのビルドのベースとなるOracle JDKリリースは、次のように更新されました:
- 8u291 (Java 8ベースのGraalVM Enterprise用、Java SE 8リリース・ノートを参照)
- 11.0.11 (Java 11ベースのGraalVM Enterprise用、Java SE 11リリース・ノートを参照)
- 16.0.1 (Java 16ベースのGraalVM Enterprise用、Java SE 16リリース・ノートを参照)
プラットフォームの更新
- Java 16 (試験段階)のサポート: Oracle Java 16をベースにしたGraalVM Enterpriseディストリビューションはダウンロードして入手できますが、いくつかの既知の制限があります。
- MacOSプラットフォームのサポート: Oracle JDK 8をベースにしたmacOS用のGraalVM Enterpriseビルドは引き続き入手可能ですが、OpenJDK 8をベースにしたmacOS用のGraalVM Communityのビルドは生産を終了しました。
- Linux AArch64プラットフォームの互換性: Linux AArch64アーキテクチャ用のGraalVM Enterpriseディストリビューションは、このリリースではまだ試験段階にあります。サポートされている機能には、GraalVMコンパイラ、
gu
ツール、Node.js JavaScriptランタイム、ネイティブ・イメージ、一部の開発者ツールなどがあります。
コンパイラ
- 反転(テール・カウント)ループをカウント済ループとして検出するためのサポートが追加されました。GraalVM Enterpriseでは、このようなループがカウント済として検出され、他のすべてのカウント済ループと同様に分析および最適化できるようになりました。これらのループは、完全なアンロール、部分的なアンロール、ガードの最適化およびベクトル化の対象となります。この新しい機能は、
-Dgraal.DetectInvertedLoopsAsCounted=false
を使用して無効にできます。* GraalVM Enterpriseに新しいループ反転の最適化が追加されました。これにより、通常のループから反転ループを生成するためのコンパイラ・サポートが追加されます。反転ループには、通常のヘッドカウントされたループと比較して、命令レベルの並列性および最適化の機能に関する優れた特性があります。反転ループ・シェイプを使用するマイクロ・ベンチマークでは、最大30%のパフォーマンスの向上が見込まれます。ループ反転はデフォルトでオンになっており、-Dgraal.LoopInversion=false
を使用して無効にできます。 x == y
という形式の条件で保護されているコードを分析し、置換によりさらに最適化される可能性があればx
のすべての使用をy
に(またはその逆に)置き換える、新しい最適化が追加されました。* ベクトル・バイト反転をサポートするためのSIMDベクトル化が拡張されました(例:Integer.reverseBytes
)。SIMDベクトル化はまだ試験段階であり、デフォルトでは有効になっていません。-Dgraal.VectorizeSIMD=true
を使用して有効にします。*hash = c * hash + array[i]
を使用したhashCode
のようなループのベクトル化のサポートが追加されました。-Dgraal.VectorizeHashes=false
を使用して無効にします。- 揮発性フィールドが配列からロードされ、要素に関する型情報が失われる結果、不要なキャストが発生することがないように、ロードされた配列要素のノードへのキャストが排除されました。
ConcurrentHashMap
のこのメソッドは、一例です:static final <K,V> Node<K,V> tabAt(Node<K,V>[] tab, int i) { return (Node<K,V>)U.getObjectVolatile(tab, ((long)i << ASHIFT) + ABASE); }
- x86での順次揮発性書込みにおける不要なメモリー・バリアーを排除します。
ConcurrentHashMap
などのクラスには、(インライン化後に)多数の揮発性書込みが連続して発生するパターンがあります。GraalVMコンパイラは、シーケンス内の最後の書込みを除くすべての書込みに対してメモリー・バリアーを省略するようになったため、ConcurrentHashMap.transfer
などのメソッドが高速になりました。
ネイティブ・イメージ
- ローカライゼーションのサポートが改善されました。ネイティブ実行可能ファイルに含めるロケールと、デフォルトにするロケールを指定できるようになりました。たとえば、デフォルトのロケールをドイツ語に切り替え、さらにフランス語と英語も含めるには、
-H:DefaultLocale=de -H:IncludeLocales=fr,en
を使用します。-H:+IncludeAllLocales
を使用すると、すべてのロケールを含めることができます。 --enable-all-security-services
オプションは不要になったため、非推奨となりました。セキュリティ・サービスは、静的分析で使用されている場合、自動的に登録されるようになりました。- Windowsでのサポートの向上: アプリケーションでパラメータに対してファイルのグロービングが行われるようになりました。
- 複数のアーティファクトを生成するためのネイティブ・イメージ・ビルドに関するレポートが追加されました。ビルドの結果はimagename.build_artifacts.txtファイルに書き込まれます。
- LinuxおよびmacOSで、デバッグ情報生成のために
-g
が渡されたときに、ネイティブ・イメージに含められるすべてのメソッドに関するローカル・シンボルが生成されるというバグが修正されました。デバッグにメソッド・シンボルは必要ありません。Dwarfデバッグ情報にもこの情報が含まれているためです。特定のプロファイラの場合など、ローカル・シンボルが必要な場合は、(-g
オプションとは別に)-H:-DeleteLocalSymbols
を使用してイメージにそれを含めることができます。 - アプリケーションと共有ライブラリなど、複数の異なるネイティブ・イメージを同じプロセス内で使用できるようになりました。これはLinuxプラットフォームで必要でした。
- ビルド時の初期化で自動的にマークされるクラスが増えました。これにより、実行時のクラス初期化のオーバーヘッドが削減されます。
ポリグロット・ランタイム
- デフォルトで複数層コンパイルが有効になりました。この機能は、最初に20.3で試験段階のオプションとして導入されたものです。Truffleでは2層のコンパイルが使用されるようになりました。第1層はコンパイル速度に関して最適化されており、GraalVMコンパイラのエコノミー構成を再利用して、簡単なメソッドのみのインライン化により高速なコンパイルを実行します。第2層ではGraalVMのすべてのコンパイラ最適化が有効になった状態でコンパイルされ、第1層のコンパイルの完了後に実行されます。ベンチマークの結果から、ほとんどの言語でウォームアップが大幅に向上することがわかりました。
- 最新のJVMCIバージョン21.1-b02へのオプションの依存性を必要とする言語実装の新機能が追加されました(問題JDK-8263776)。次のリリース21.2では、コア・ランタイム機能にこれらの機能の一部を使用することを計画しているため、JVMCI 21.1-b02は必須の依存性になる予定です。これにより、JVMCI 21.1-b02をサポートしないJDKリリースのランタイム・コンパイルはサポートされなくなります。すべてのTruffle言語は引き続きどのJDKでも実行できますが、実行時コンパイルのサポートはありません。
- 複数層コンパイルのコンパイルしきい値を設定する新しい試験段階フラグが導入されました:
--engine.FirstTierCompilationThreshold
は第1層のしきい値を設定し、--engine.LastTierCompilationThreshold
は第2層のしきい値を設定します。複数層コンパイルが無効になっている場合は、--engine.SingleTierCompilationThreshold=x
を使用できます。元のオプション--engine.CompilationThreshold
は非推奨になりました。今後のリリースで削除される予定です。 - HotSpotが提供する新しい試験段階のコンパイル・キュー実装が追加されました。この実装はまだデフォルトで有効になっていませんが、
--engine.TraversingCompilationQueue
オプションを使用して試すことができます。このフラグにより、ウォームアップ時間の短縮が期待されます。次のリリースではさらに多くの変更および拡張が計画されており、これがデフォルトの実装になることが予想されています。 --engine.CompilationThreshold
オプションが非推奨になりました。かわりに、--engine.FirstTierCompilationThreshold
および--engine.LastTierCompilationThreshold
を使用してください。
Java on Truffle
- Java Debug Wire Protocol (JDWP)サポートに対する多くの修正および改善が導入されました。デバッグが有効になっている間にTruffleでのJavaのパフォーマンスが向上する(最大200倍)、多くのエッジ・ケースが修正されました。
- メソッドの再定義のための修正が提供されました: リフレクティブ・アクセスおよびMethodHandlesがメソッドの変更に従うようになりました。
- シグナル・ハンドラ(
sun.misc.Signal
/jdk.internal.misc.Signal
)のサポートが追加されました。つまり、Ctrl-C
を使用してプログラムを閉じるときにシャットダウン・フックが実行されるようになりました。 - 非推奨のScope APIへの依存性を削除し、かわりに新しく導入された
NodeLibrary
を実装しました。 - GraalVMエンベッダAPIによってレポートされるゲスト・スタック・トレースが修正されました(PolyglotException)。
- スレッド作成を制限するためのサポートが改善されました。
JavaScript
- Node.jsがバージョン14.16.1に更新されました。
- Node.jsサポートはデフォルトでは有効になっていないため、必要に応じてGraalVM Updater (
gu install nodejs
)を使用して明示的にインストールする必要があります。JavaScriptランタイムは、引き続き基本のGraalVMインストールに含まれています。 - イテレータの相互運用性サポートが追加されました。これにより、JavaScriptイテレータをValue API (
hasIterator()
、getIterator()
、hasIteratorNextElement()
、getIteratorNextElement()
)を介して使用したり、他の言語の反復可能オブジェクトをGraalVMのJavaScriptランタイムで(for-ofループなどを介して)反復できます。 - バッファの相互運用性サポートが有効になりました。これにより、ホスト
ByteBuffers
および他の言語のバッファを、コピーせずにJavaScript型付き配列(new Uint8Array(foreignBuffer)
など)およびDataView
で使用できます。また、Value API (readBuffer*
、writeBuffer*
)を介してArrayBuffers
にアクセスすることもできます。 - WebAssembly JavaScriptインタフェースの試験段階のバージョンが実装され、JavaScriptプログラム内からWebAssemblyプログラムを呼び出せるようになりました(
--js.webassembly
オプションの背後で使用可能)。
プロジェクト・リポジトリ内の変更ログが使用可能です。
LLVMランタイム(Sulong)
* ネイティブ・モードが完全に削除された状態でGraalVMまたはネイティブ・イメージをビルドする機能(このため、--llvm.managed
モードのみが機能します)。
- ネイティブ・バッファと同様に、外部のバッファに似たオブジェクト(JS
ArrayBuffer
など)へのポインタに透過的にアクセスされるようになりました。 - ポリグロットAPIに加えて、通常の
dlopen
を使用したビットコード・モジュールをロードするためのサポートが追加されました。 - Linux AArch64プラットフォームの試験段階のサポートが追加されました。
- ロードされたビットコード・ファイルがGraalVM LLVMランタイム用に正しくコンパイルされていることを検証する健全性チェックが実装されました。具体的には、管理対象モード用にビルドしたがネイティブ・モードで使用しているビットコードをロードする場合、またはその逆の場合、これは失敗します。
--LLVM.verifyBitcode=false
オプションを使用して、これを致命的でない警告に変換できます。
プロジェクト変更ログはGitHubで使用可能です。
Ruby
- より包括的なRuby 2.7サポートが実装されました(詳細は#2004を参照)。
- 複数層コンパイルがデフォルトで有効になり、ウォームアップが大幅に向上しました。
- gemのインストール時にGraalVM LLVMツールチェーンを
PATH
の先頭に追加することで、静的ライブラリにリンクするC拡張機能が汎用的に動作するようになりました。 - 再帰チェックのパフォーマンスが向上しました(#2189)。
- 同期を回避することで乱数生成のパフォーマンスが向上しました(#2190)。
- デフォルトでブロックごとに2つではなく1つのコール・ターゲットを作成する機能が実装されました。
- クラス変数のいくつかの使用が最適化されました(#2259)。
- コール側フレームを必要とする複数のメソッドをコール側で常にインライン化することで、インタプリタを高速化し、フットプリントを削減しました。
- 言語バインディングを介した対話型
Binding
のローカル変数にアクセスするためのサポートが追加されました:context.getBindings("ruby").putMember("my_var", 42);
。#2030を参照してください。 - マルチスレッドをトリガーせずにシグナル・ハンドラが実行されるようになりました。
- デバッグ・インスペクタC APIが実装されました。
irb
のパフォーマンスと互換性の向上のために、io-console
C拡張機能に切り替わりました。IRB
1.3.3およびreline
0.2.3に更新され、IRBへのコードの貼付けが適度に高速になりました(#2233)。- TruffleRubyのスタンドアロン・ビルドは、JDK11をベースにしています(以前はJDK8を使用していました)。
詳細は、TruffleRuby変更ログを参照してください。
Python
- Jython移行パスを改善するために、Javaサブクラス化および新しい相互運用性APIのサポートが改善されました。JavaからのPython型の簡便な反復処理、PythonからのJava抽象クラスおよびインタフェースの実装、PythonコードでのJava例外の捕捉および再スローなど、Jythonで頻繁にリクエストされ使用可能になった機能が、GraalVMのPythonランタイムでも提供されるようになり、移行が容易になりました。
- SSLのサポートが追加されました。これにより、追加設定なしでPythonパッケージをインストールできます。ユーザーは、Python
pip
インストーラを実行して、CPythonの場合と同様に、Pythonパッケージとその依存性をダウンロードできるようになりました。 posix
APIの完全にネイティブなバックエンドが追加されました。これにより、ファイルシステム・アクセスのパフォーマンスと互換性が向上します。- GILでのマルチスレッドのサポートが追加されました。マルチスレッドは、GraalVMのPythonランタイムでCPythonと同程度にサポートされます。つまり、ほとんどのワークロードで並列処理はサポートされず、同時実行性があるのみです。
- 現在のHPy Python C APIのサポートが追加され、C拡張機能の実行時のパフォーマンスが向上しました。これは、NumPyおよびその他の一般的なPython C拡張機能に対して高速APIを提供するための、PyPyプロジェクトおよびケープタウン大学のメンバーと共同で実施中の調査プロジェクトです。
詳細は、プロジェクト変更ログを参照してください。
R
- GraalVMのRランタイムがR 4.0.3にアップグレードされました。
- GraalVM RランタイムはR 4.0.3との互換性を概ね持つようになりました。
- 新しいバージョンの基本パッケージおよび推奨パッケージに移行しました。
- R 4.0.3の新機能の一部を実装しました(完全なリストは変更ログを参照)。
install.packages
でデフォルトで使用されるCRANスナップショットが2021-02-01にアップグレードされました:- GraalVMのRランタイムでの最も一般的なパッケージの一部の新しいバージョンに対するサポートについては、作業を実施中です。
- 既知の問題があるパッケージはまだ残っています:
dplyr
1.0.3、ggplot
3.3.3、knitr
1.31。
詳細は、プロジェクト変更ログを参照してください。
WebAssembly (GraalWasm)
- GraalWasmインタプリタの速度と全体的なピーク・パフォーマンスが10倍以上向上しました。
- Truffleファイルシステム・レイヤーを介してファイルを操作およびファイル・システムにアクセスできるように、基本的なWASI機能が提供されました。
- GraalWasmは現在、公式のWebAssemblyテスト・スイートのほとんどのテストに合格しています。
- スタンドアロンGraalWasmランチャの速度、および全体的なピーク・パフォーマンスが向上しました。
- GraalVMのJavaScriptランタイムで実行されているJavaScriptプログラム内からWebAssemblyプログラムを起動できるように、WebAssembly-JavaScriptインタフェース仕様が実装されました。
- .wasmファイル内のカスタム名セクションの解析が実装され、スタック・トレースがわかりやすくなりました。
- GraalWasmインタプリタがバイナリ検証ルールに準拠しました。
- 仕様に定義されている、バイナリの解析およびリンク時のメモリー/テーブル/関数のカウント制限のチェックが導入されました。
- 一部のパスコード例で指数コンパイル速度を低下させないためのチェックが追加されました。
ツール
Visual Studio Code拡張機能
- ユニット・テストの結果の可視化が追加されました:
- YAML <> Javaコード編集機能が追加され、Micronautサポートが向上しました:
- 多数のリファクタリングが追加されました。
- MicronautプロジェクトのDockerビルド・コマンドが組み込まれました。
- MavenおよびGradleマルチプロジェクト・ビルドのサポートが向上しました。
VisualVM
- 次期JDK 16のサポートが追加されました(#260)。
- 新しいApple M1プロセッサ(aarch64)のサポートが追加されました(#262)。
- 以前のリリースからのプラグインのインポートのサポートが追加されました(#270)。
- jlinkで作成したJDK 9 +から取得された、ヒープ・ダンプ機能の有効なモジュールの表示リストが追加されました(#275)。
ポリグロット埋込み
* ゲスト・アプリケーションの実行中に保持できる最大ヒープ・メモリーを指定する、新しい試験段階のサンドボックス・オプション--sandbox.MaxHeapMemory=<size>
が追加されました。現時点では、この機能はHotSpotでのみサポートされています。この機能はまだ試験段階です。
- バイト・バッファに似たデータ構造のサポートが追加されました。このリリースでは、
Value.hasBufferElements()
のようなバッファ値にアクセスするための新しいメソッドが追加されています。Javaホストの相互運用性が改善され、java.nio.ByteBuffer
実装を処理してネイティブのゲスト言語バッファのように動作させられるようになりました。この機能は、HostAccess.Builder.allowBufferAccess(boolean)
を使用して有効化および無効化できます。ポリグロット・バッファのサポートは言語によって異なる場合があります。詳細は、個々の言語変更ログを参照してください。 - 反復可能オブジェクトおよびイテレータに似たデータ構造のサポートが追加されました。これには、ポリグロット値がイテレータであるか、
Value.isIterator()
およびValue.hasIterator()
で反復可能であるかを検出する新しいメソッドが含まれます。イテレータおよび反復可能オブジェクトを模倣するための新しいプロキシ・インタフェースProxyIterator
およびProxyIterable
が追加されました。Javaホストの相互運用性が改善され、java.util.Iterator
およびjava.util.Iterable
実装を処理してゲスト言語の値のように動作させられるようになりました。この機能は、HostAccess.Builder.allowIteratorAccess(boolean)
およびHostAccess.Builder.allowIterableAccess(boolean)
を使用して有効化および無効化できます。ゲスト言語イテレータは、Value.as(Iterator.class)
を使用してJavaイテレータにマップできるようにもなりました。この機能のサポートは、個々の言語で異なる場合があります。詳細は、言語変更ログを参照してください。 - マップに似たデータ構造のサポートが追加されました(問題#143)。これには、ポリグロット値がハッシュ・マップに似たデータ構造を表すかどうかを問い合せる
Value.hasHashEntries()
など、ポリグロット値に対する新しいメソッドが含まれます。このような値を模倣するための新しいインタフェースProxyHashMap
が追加されました。Javaホストの相互運用性が改善され、java.util.Map
実装を処理してゲスト言語ハッシュ・マップのように動作させられるようになりました。この機能は、HostAccess.Builder.allowMapAccess(boolean)
を使用して有効化および無効化できます。ゲスト言語のマップは、Value.as(Map.class)
を使用してJavaのMapにマップできるようにもなりました。この機能のサポートは、個々の言語で異なる場合があります。詳細は、言語変更ログを参照してください。 - ホスト・メソッドの実行中にポリグロット・コンテキストのスレッド・ローカル・アクションを協調的にポーリングするために、
Context.safepoint()
が追加されました。たとえば、これにより、コンテキストは中断や取消しを確認できます。
すべての変更の詳細なリストは、変更ログを参照してください。
Truffle言語およびツールの実装
- 言語実装に対してゲスト言語セーフポイントで実行するスレッド・ローカル・アクションを送信するためのサポートが追加されました(問題JDK-8263776)。言語またはツールの実装でこの機能を適応させて使用する方法については、チュートリアルを参照してください。
- ネイティブ・バッファとの統合を向上させる、InteropLibrary内のバッファ要素の新しい相互運用性トレイトが追加されました。
- InteropLibrary内の反復可能オブジェクトの新しい相互運用性タイプ・イテレータおよび新しいトレイトが追加され、言語間のコレクションのトラバースが向上しました。
- InteropLibrary内のハッシュ・エントリの新しい相互運用性トレイトが追加され、ゲスト言語ハッシュ・マップ間の相互運用性が向上しました(問題#143)。
- コンテキストで保持されるヒープ・サイズを計算するための
TruffleInstrument.Env.calculateContextHeapSize(TruffleContext, long, AtomicBoolean)
が追加されました。 - AOT特殊化ノードの準備をサポートするための
@GenerateAOT
が追加されました。TruffleおよびAOTのコンパイルを開始するには、AOTのチュートリアルをお読みください。また、コール・ターゲット作成時にAOTコンパイルをトリガーするための--engine.CompileAOTOnCreate
オプションも追加しました。次のリリースでは、さらに多くの変更および拡張が計画されています。 - floatまたはdoubleの小数部を削除する(ゼロに丸める)ために、それぞれ
ExactMath.truncate(float)
メソッドおよびExactMath.truncate(double)
メソッドが追加されました。これらのメソッドはイントリンシックになっています。 - 言語コンテキストの初期化が完了または失敗したときのいくつかの新しいイベントが
ContextsListener
に追加されました。 - 値が正確な型かどうかをチェックするための
CompilerDirectives.isExact(Object, Class)
が追加されました。value != null && value.getClass() == exactClass
パターンのかわりにこのメソッドを使用する必要があります。 Frame.clear(FrameSlot)
が追加されました。これにより、コンパイラはローカル変数の有効性について推理できます。言語は、適用可能な場合にはこの方法を使用することが推奨されます。- コンテキスト・バウンド・ロガーを作成する
TruffleLanguage.Env.getLogger(String)
およびTruffleLanguage.Env.getLogger(Class<?>)
が追加されました。返されるTruffleLogger
は、常にEnvのコンテキストからのロギング・ハンドラとオプションを使用し、スレッドへの入力には依存しません。 - マルチスレッドをトリガーせずに別のスレッドを待機するための
TruffleContext.leaveAndEnter(Node, Supplier)
が追加されました。 - 実行時コンパイルで部分評価に適していないことがわかっているメソッドが到達可能な場合に、Truffle言語のネイティブ・イメージ・ビルドが失敗するようになりました。このチェックは、ネイティブ・イメージ・ビルダーの
-H:-TruffleCheckBlackListedMethods
オプションで無効にできます。非推奨のTruffleLanguage.Env.getTruffleFile(String)
、TruffleLanguage.Env.getTruffleFile(URI)
メソッドが削除されました。 - Truffleコンテキストが取り消されているかどうかを確認するための
TruffleContext.isCancelling()
が追加されました。 - 特殊化DSL
@NodeChild
注釈に新機能が追加されました: 親ファクトリ・メソッドによる子ノードの暗黙的な作成を可能にするために、implicit
およびimplicitCreate
属性が追加されました。 @NodeChild
を@GenerateUncached
とともに使用できるように、allowUncached
およびuncached属性が追加されました。- プロファイルは、
Profile.disable()
を使用して無効にし、Profile.reset()
を使用してリセットできるようになりました。 - Truffleインストゥルメンテーションで、新しい
EventBinding.attach()
メソッドによる2フェーズ・アタッチのサポートが追加されました。
すべての変更の詳細なリストは、Truffleフレームワーク変更ログを参照してください。
Oracle GraalVM Enterprise Edition 21.0.0.2
(2021-02-11)
これは、GraalVM 21.0.xブランチのバグ修正リリースです。これには、オプションのGraalVM言語ランタイムおよびユーティリティをインストールし、ローカルのGraalVMインストールを更新するためのツールであるGraalVMアップデータの操作上の変更が含まれています。
- GraalVM CommunityからGraalVM Enterprise Edition (
gu upgrade --edition ee
)への移行時にコンポーネントがアップグレードされないように、アップグレード・ポリシーが拡張されました。 - ユーザーがOracle GraalVM Enterprise Editionネイティブ・イメージ・ライセンスに同意するよう求められたときの
gu
によるライセンス同意の処理が改善されました。
Oracle GraalVM Enterprise Edition 21.0.0
(2021-01-19)
Java
- Java 8およびJava 11に基づくGraalVM Enterpriseディストリビューションの基礎となるJDKが、Oracle JDKバージョン1.8.0_281およびOracle JDKバージョン11.0.10に更新されました。これらのバージョンのリリース・ノートは、「Oracle Java SEダウンロード」で入手できます。
Java on Truffle
- Truffleインタプリタに基づく試験段階のJava仮想マシンの実装が追加されました。詳細は、ここを参照してください。
プラットフォームのサポート
このバージョンでは、AArch64システムでのLinux用のGraalVMディストリビューションが提供されています。GraalVMコアを含むすべてのコンポーネントは試験段階にあります。このディストリビューションは、AArch64アーキテクチャ用のOracle JDK11をベースにしています。
ネイティブ・イメージ
- ネイティブ・イメージのシリアライズ・サポートが追加されました。シリアライズ・サポートにより、クラスのコンストラクタがネイティブ・イメージに確実に含まれるため、最初にデシリアライズできます。これらのクラスは、リフレクションの継続と同様に、追加の特定の構成ファイルにホワイトリスト登録します。これは、ネイティブ・イメージの一部である可能性はあるが、構成ファイルにリストされていないクラスなど、一部のクラスをデシリアライズできないためです。構成ファイルを手動で作成したり、GraalVMに付属のトレース・エージェントを適用すると構成ファイルの書込みに役立ちます。
- ネイティブ・イメージのメソッド・ハンドル呼出しサポートが追加されました(「#2761」を参照)。メソッド・ハンドルを介してアクセスされるメソッドおよびフィールドは、リフレクション構成ファイルに登録する必要があります。また、ネイティブ・イメージ・ビルドの構成を自動的に生成するトレース・エージェントにメソッド・ハンドルのサポートが追加されました。メソッド・ハンドルのほとんどのユースケースがサポートされています。静的フィールドに格納されていないVarHandleはまだサポートされていません。
- LinuxプラットフォームのAWTおよびSwingサポートが追加されました(トレース・エージェントを使用した構成コレクションが必要です)。
- 必要な構成エントリの数を減らし、イメージ・サイズを小さくするために、試験段階の
-H:+InlineBeforeAnalysis
オプションが追加されました。 - トレース・エージェントが改善されました。
Class.getClasses
およびClass.getDeclaredClasses
のインスタンスが取得されるようになりました。 - モジュールを使用して宣言されたサービスをスキャンするように
ServiceLoaderFeature
クラスが改善されました。 - ネイティブ・イメージ・ヒープで
Random
のインスタンスが許可されなくなりました。 - GCパフォーマンスが向上しました(GCに費やす時間が短縮されました)。
Truffle APIを使用する言語およびツール・インプリメンタの更新
- 複数層コンパイルに関連する多くの問題が修正されました。21.1では、複数層コンパイル(
--engine.MultiTier
)がデフォルトで有効になります。 - Truffleインタプリタのホスト・コンパイルをガイドするディレクティブに
HostCompilerDirectives
が追加されました: HostCompilerDirectives.BytecodeInterpreterSwitch
は、バイトコード・インタプリタに命令ディスパッチ・スイッチを含めるメソッドを示しますHostCompilerDirectives.BytecodeInterpreterSwitchBoundary
は、バイトコード・インタプリタ・スイッチにインライン化する必要のないメソッドを示します- Truffle DSLで生成されたノードは、64状態ビットに制限されなくなりました。これらの状態ビットはユーザーの責任で使用してください。
- その他の変更は、変更ログにリストされています。
ポリグロットの埋込み機能の更新
- カッコで囲まれたカンマ区切りの完全修飾パラメータ型名の形式のシグネチャを使用してホスト・メソッドのオーバーロードを明示的に選択するためのサポートが追加されました(例:
methodName(f.q.TypeName,java.lang.String,int,int[])
)。 - JNIの難号化されたシグネチャによるホスト・メソッドの選択は非推奨になり、前述の新しい形式に置き換えられました。21.2で削除することが予定されています。
JavaScript
- Node.jsがバージョン12.20.1に更新されました。
- 次のECMAScript 2021モード/機能がデフォルトで有効になりました:
- クラス・フィールド
Promise.any
String.prototype.replaceAll
- 論理代入演算子
- 新しい相互運用性例外処理が採用され、JS例外によって
AbstractTruffleException
クラスが拡張されました。 Graal.versionJS
のかわりにGraal.versionECMAScript
が公開されました。- 相対インデックス付けメソッドの提案が実装されました。これは、ECMAScript 2022モード(
--js.ecmascript-version=2022
)で使用できます。
Python
- Jythonとの互換性のために
jarray
モジュールが追加されました。 - Pandasのサポートが改善され、Matplotlib視覚化ライブラリの初期サポートが追加されました。
- 共有エンジンでNumPyを実行するときに発生する可能性のあるメモリー・リークおよびクラッシュを回避するための修正が提供されました。
- スニペットを貼り付けるときのREPLの無限継続プロンプトが修正されました。
詳細は、変更ログを参照してください。
Ruby
- 新しいIRBは、コードをコピーして貼り付けると非常に遅くなります。これは、次のリリースで対処される非効率な
io/console
の実装が原因です。回避策として、irb --readline
を使用します。これにより、一部のIRB機能が無効になりますが、コードのコピー/貼付けが大幅に高速になります。
新機能:
- Ruby 2.7.2に更新されました。Ruby 2.7のほとんどの機能および変更が実装されています(「#2004」を参照)。
バグの修正:
互換性:
**kwargs
は、Ruby 2.7などの非シンボル・キーを受け入れるようになりました。
パフォーマンス:
- よりパフォーマンスの高い
MatchData#length
をリファクタおよび実装します(「#2147」を参照)。 - よりパフォーマンスの高い
Array#sample
をリファクタおよび実装します(「#2148」を参照)。 String#inspect
がより効率的になりました。
変更点:
- すべての
InteropLibrary
メッセージが、Truffle::Interop
のメソッドとして一貫して公開されるようになりました(「#2139」を参照)。一部のメソッドの名前が、ドキュメントに記載されているスキームと一致するように変更されました。 - 詳細は、変更ログを参照してください。
R
- R検証パッケージをインストールしようとしたときの
AssertionError
が修正されました(問題「#169」)。
LLVMランタイム
- AST共有が改善され、補助エンジンのキャッシングがサポートされるようになりました。1つのエンジンの複数のコンテキスト間でコードを共有できる通常のAST共有にこの機能が追加されたことにより、共有コードを永続化し、プロセス境界をまたいで共有できます。
- macOS (macOS Big Sur)の現在のメジャー・リリースのサポートが追加されました。
非推奨:
- 古いヘッダー・ファイルの場所
polyglot.h
およびllvm/api/toolchain.h
に非推奨の警告が追加されました。これらのヘッダー・ファイルは20.3.0ではすでに非推奨になっていますが、警告は表示されません。
WebAssembly (GraalWasm)
- このリリースでは、セマンティクス、リンクおよびモジュール内検証に多数のバグ修正が含まれていました。GraalVMのWebAssemblyインタプリタは、公式の仕様テスト・スイートのほぼすべてのテストに合格しました。
- JS-to-WebAssemblyインタフェースAPIに必要
Polyglot
バインディングが公開されました。 - GraalWasmインタプリタが最適化され、インタプリタ実行モードのウォームアップおよび全体的なピーク・パフォーマンスが20倍向上しました。
- オフヒープ・メモリーのかわりにバイトバッファ・ベースのメモリーを使用することにより、セキュリティが向上しました。
ツール
GraalVMアップデータ
バージョン21.0以降、GraalVMアップデータはより強力になり、これを使用してGraalVMローカル・インストールを新しいバージョンに更新したり、CommunityからEnterprise Editionにアップグレードできるようになりました。詳細は、「GraalVMのアップグレード」を参照してください。
Visual Studio Code拡張機能
- リファクタリングおよび他の生産性機能が追加されました。
GraalVMダッシュボード
- 大量の整数プロパティをサポートするように、BGV形式が改善されました。
VisualVM
- VisualVMの以前のインストール設定をシームレスにインポートできるようになりました。