Oracle GraalVM for JDK 21.0.2
(2024-01-16)
これは、Oracle GraalVM for JDK 21用の2024年1月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2024年1月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、次にリストした注目すべきバグ修正、およびプラットフォーム更新が含まれます。
- GraalVM Enterprise Editionが構築されているOracle JDKリリースが更新されました:
- 21.0.2+13 (Java 21ベースのGraalVM Enterprise)。「Java SE 21リリース・ノート」を参照してください
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン23.1.2は、GraalVM for JDK 21.0.2で使用するように設計されています。
- コンパイラの修正:
- ループの不変数および定数に再関連付けできるバイナリ算術演算が再編成されました。
- コンパイルの失敗を原因とするSulongベンチマークの失敗が修正されました。
- 条件付き移動最適化コスト計算が改善されました。
- Pythonコードを使用してJavaホスト・アプリケーションのBouncy Castleライブラリを事前にコンパイルするときに、
ConditionalMoveOptimizationPhase
でStackOverflowError
が発生するバグが修正されました。 - AArch64アーキテクチャのサポートが改善されました:
BranchOp
によるFarBranch
の発行が可能になり、AArch64 HotSpotでのnull定数コード生成がより汎用的になりました。 - ガード・アンカーによる
CaptureStateBegin
が確実になりました。 IntegerLessThanNode
にキャストする前にコンパイラがスタンプをチェックするようになりました。- Epsilonガベージ・コレクタでは、
HeapImpl.dirtyAllReferencesOf
をno-opにする必要があります。 ValueAnchorNode
の実装が簡素化されました。checkcast
およびinstanceof
の生成中の明示的なnullチェック例外が削除されました。
- ネイティブ・イメージの修正:
- Windows 11およびWindows Server 2022を認識するようにOS検出コードが更新されました。
- 最大ヒープ・サイズを超えるVM操作を許可するオプションが追加されました。
- アサーションが有効な場合の
-XX:+PrintGCSummary
の問題が修正されました。 - 分離ティアダウン中のクラッシュが修正されました。
- ネイティブ・イメージで、クラッシュしたスレッドが無視されるようになりました。
- OutOfMemoryErrorメッセージが改善されました。
EnterpriseAddressRangeCommittedMemoryProvider
のチェックが修正されました。- ネイティブ・イメージでは、メモリー使用量が
MemoryPoolMXBean
を介して問い合せられると、一貫した値がレポートされるようになりました。 mx
ツールの--disable-debuginfo-stripping
引数が導入されました。- 不適切な場所に格納されている
native-image
JSONプロパティの処理が修正されました。 System.console().readPassword
の失敗を防ぐ修正が追加されました。- BFD名前マングラ#7423におけるプリミティブ型のマングリングが向上しました。
- ドライバがイメージの場合に、
native-image --bundle-create,container
コマンドが失敗する問題が修正されました。 - NIO/cgroupsコードに初期化サイクルの分岐が作成されました。
- G1ガベージ・コレクタが共有ライブラリとして構築されている場合、スタックが実行可能ファイルとして処理されます。
PointsToAnalysisMethod.getContextInsensitiveVirtualInvoke
での一時的な保証の失敗が修正されました。- JFRのサポートが改善されました。
Thread.currentThread()
ではなくPlatformThreads.getCurrentThreadOrNull()
に切り替えられ、JVM.commit(long)
の競合状態が修正されました。 FrameInformation
を必要とするメソッドに対して、DeoptTargets
が確実に生成されるようになりました。- ネイティブ・イメージ・ビルダーで、同期データ構造を使用して到達可能性ハンドラが登録されるようになりました。
- クラッシュ・ログをダンプする非同期シグナル安全な方法が追加されました。
- ヘッダー・サイズを人為的に増やすオプションが追加されました。
- ネイティブ・イメージのクラッシュ・ログに使用されるスタック・ウォーキング・ヒューリスティックが修正されました。
- Windowsの
joinThreadUnmanaged
が修正されました。 __svm_version_info
にベンダー・バージョンが使用されます。- ビルダーで
AccessControlContext
スタックにThreadLocal
が使用されるようになりました。 - MANIFESTファイルにClass-Path属性が含まれる場合のクラスパスの順序が修正されました。
- イメージの実行時に、ブートストラップ・メソッドの実行と動的定数の実行がサポートされるようになりました。
- ロジックを要求するG1ガベージ・コレクタ・スレッドが修正されました。
- 例外処理が失敗した場合に、ネイティブ・イメージでクラッシュ・ログが出力されるようになりました。
- null値がある
arraycopy
のclinit
シミュレーションが修正されました。 - 登録されている場合にのみ、ネイティブ実行可能ファイルに署名者が含まれるようになりました。
@Unknown*Field
という注釈が付いたフィールドには、シャドウ・ヒープを使用しないでください。
- Truffleフレームワークの修正:
- 不明瞭化していないGraalVMと、不明瞭化したMavenアーティファクトを混在させると失敗します。
- 不適切な場所に格納されているjson-23.1.0.jarのnative-image.propertiesが処理されます。
- JSONパーサー・ライブラリorg.JSONがバージョン20231013にアップグレードされました。
- Sulong上で動作するプラットフォームにおけるEspressoコンテキスト生成の低下が修正されました。
- 実行時コンパイルにおけるリンクされていないタイプの処理が修正されました。
- クラスパスの分離がデフォルトで無効になりました。
- 非連鎖のポリグロット・バージョン・チェックが追加されました。
- 失敗して例外をスローするアサーション・トリガー・チェックが追加されました。
- グローバル
PolyglotIsolate.Lazy#hostToGuestObjectReferences
が、HSContext
ごとに変更されました。
- ツール:
- 必須の実験プロパティ
debuggerId
が追加され、/json/listパスのGETが処理されるようになりました。
- 必須の実験プロパティ
- Javascript:
- バージョン18.18.2への更新後に、必要なNode.js構造が更新されました。
- ホスト・コールからコールされたクローズ時に、明示的に入力されたコンテキストが自動的に終了しないようになりました。
- LLVM:
- Xcode 15でビルドされている場合、LLVMの初期化が失敗します。
- IOアクセスが拒否されると、Sulongライブラリのロードが低下します。
- Java on Truffle (Espresso):
EspressoForeignList
内の外部フィールドが不要になりました。- 不足していたEspressoアーティファクトがMavenに追加されました。
- Espressoオブジェクトを処理しない
ToEspresso
コレクション型ノードが修正されました。 - 外部例外とカスタム型コンバータについて、型コンバータの組合せが修正されました。
- Python:
- GraalVM Community Editionでのみ動作するPython JVMスタンドアロンが修正されました。
- Ruby:
- スタンドアロンですべてのTruffleRubyテストが実行されます。
- WebAssembly:
- GraalWasmからのファイル・システム・アクセス。
- TRegex:
- OracleDBフレーバが追加されました。
- GraalVM統合:
- Jipher jceが10.32に、pkiが10.15に更新されました。
- デプロイされたアーティファクトのリストが修正されました。
- ターゲット呼出しのないラムダ。
Oracle GraalVM for JDK 21.0.1
(2023-10-17)
これは、Oracle GraalVM for JDK 21用の2023年10月Oracleクリティカル・パッチ・アップデート(CPU)です。このリリースには、2023年10月Oracleクリティカル・パッチ・アップデート・アドバイザで発表されたセキュリティの脆弱性に対する修正が含まれています。これには、そのCPUの一部としてリリースされたセキュリティ修正、注目すべきバグ修正(下を参照)、およびプラットフォーム更新が含まれます。
- Oracle GraalVM for JDK 21が21.0.1+12に更新されました。「Java SE 21リリース・ノート」を参照してください
- バージョン互換性:
- Truffle言語および他のコンポーネントのバージョン23.1.1は、GraalVM for JDK 21.0.1で使用するように設計されています。
- コンパイラの修正:
- 事前コンパイルに
RuntimeRandomness
を使用するよう、定数ブラインディングを変更しました。 - AArch64アーキテクチャの
BranchOp
に、FarBranch
サポートを追加しました。
- 事前コンパイルに
- ネイティブ・イメージの修正:
- 使用していないメモリーをコミット解除するときに、プロセスがクラッシュする問題を修正しました。
- スタック境界を特定できない場合のために、
CEntryPointError
を追加しました。 - JDK固有の不要なJavaフライト・レコーダ・コードを削除しました。
- macOSで
ProcessBuilder
を使用して、不定期に発生するクラッシュを修正しました。
Oracle GraalVM for JDK 21
(2023-09-19)
- プラットフォームとディストリビューション
- 削除された機能
- 非推奨になった機能
- JDK 21の新機能
- Javaおよびコンパイラ
- ネイティブ・イメージ
- GraalVM SDKの分割
- ポリグロット埋込み
- JavaScriptおよびNode.js
- Java on Truffle
- LLVM
- Truffle言語およびツールの実装
プラットフォームとディストリビューション
- Oracle JDK 21をベースとしたOracle GraalVM for JDK 21をリリースしました。「Java SE 21リリース・ノート」を参照してください
- 言語ランタイムをスタンドアロン・ディストリビューションとしてリリースしたため、GraalVM JDKには言語ランチャはありません。Oracle GraalVMとGraalVM Community Editionの両方で、ネイティブ・イメージ・コンパイル済ネイティブ・ランチャまたはJVMベースのランタイム(付属)の2つのスタンドアロン言語ランタイム・オプションを使用できます。GraalVMのエディションを区別できるよう、GraalVM Community Editionバージョンの名前には、接尾辞
-community
が付いています(例:graaljs-community-<version>-<os>-<arch>.tar.gz
)。ランタイム・モードを区別するために、JVMスタンドアロン・タイプの名前には、-jvm
という部分があります。スタンドアロン・ディストリビューションは、GitHubの対応する言語リポジトリから入手できます。詳細は、こちらを参照してください。
削除された機能
- インストール・ディレクトリを変更し、GraalVM言語ランタイムとその他のコンポーネントでGraalVMインストールを拡張するために使用されていたGraalVMアップデータ(
gu
)を削除しました。OpenJDKとの連携の一環として、JDKインストールを変更することは一般的ではありません。GraalVM言語ランタイムおよびその他のコンポーネントを引き続き使用するには、言語スタンドアロンを使用するか、プロジェクトでMavenまたはGradle依存関係として指定してください。詳細は、ポリグロット埋込みの更新内容、およびGitHubの問題#6855を参照してください。 - オプション
--language:<language>
(ビルド時に特定の言語ランタイムを有効にするためのもの)およびいくつかのマクロ・オプションを削除しました。詳細は、後続の説明を参照してください。
非推奨になった機能
- LLVMツールチェーン・コンポーネントは、Oracle GraalVM for JDK 23で削除するため非推奨になりました。
Javaおよびコンパイラ
- JavaベクトルAPI (JEP 338)操作の初期最適化を実装しました。ロード、保存、基本的な算術、減算、比較、およびブレンド操作は、可能な場合には、効率的な機械命令に変換されます。これはデフォルトで有効になっており、
-Dgraal.OptimizeVectorAPI=false
で無効にできます。この最適化は、GraalVMネイティブ・イメージではまだ使用できません。今後、さらに多くの操作とネイティブ・イメージのサポートが予定されています。この最適化は試験的なものです。 - GraalコンパイラのAMD64とAArch64の両方のアーキテクチャで、JDK 21より前のすべての組込み関数を実装しました。また、SHAメッセージ・ダイジェスト・スタブおよび
BigInteger
算術計算スタブの一部を含む、様々なHotSpotアセンブリ・スタブをJavaに移植しました。これにより、パフォーマンスに優れたこれらのアセンブリ・コードが、ネイティブ・イメージにとってのメリットとなります。 - ユーザーは、
-XX:UseBranchProtectionHotSpot
オプションを設定することで、Graalコンパイラで下位エッジCFIを有効にできます。ユーザーが標準的な保護またはPAC-RET保護を行う場合でも、AArch64アーキテクチャ上で実行する際には、Graalコンパイラで下位エッジCFIが自動的に有効になります。関数が返される前に、Graalコンパイラにより、署名された戻りアドレスの整合性をチェックする認証命令が発行されます。この整合性チェックが失敗した場合は、認証命令によって、ポインタ認証コード(PAC)用に予約されている破損したアドレスの上位ビットがスタンプされ、ポインタが無効化されます。関数が破損したポインタに戻ると、OSによってSIGSEGVシグナルが生成されますが、これは、破損したポインタが、現在では(マップされていないなど)無効なアドレスを参照しているためです。悪意のあるユーザーが格納された戻りアドレスを完全に制御している場合でも、そのユーザーが、プロセス・アドレス空間の上方にあるランダム・ポイントに指定するものをリセットすることで、認証命令によって制御が取り戻されます。UseBranchProtection
の詳細は、ここを参照してください。
ネイティブ・イメージ
新機能
- ユーザーは、Linux AArch64アーキテクチャでG1ガベージ・コレクタを使用して、ヒープが大きく、一時停止時間が最小の効率的なネイティブ実行可能ファイルを構築できるようになりました(GraalVM Community Editionでは使用できません)。以前は、Linux AMD64でのみ使用可能でした。これを有効にするには、
native-image
ビルダーにオプション--gc=G1
を渡します。ネイティブ・イメージでのメモリー管理についてさらに説明します。 - 今後デフォルトになる新しいクラス初期化アプローチを導入しました。クラスの初期化構成に関係なく、すべてのクラスをビルド時に使用および初期化できるようになりました。実行時に初期化するよう構成されているクラスの場合は、実行時に再度、初期化されていないものとして表示されることを意味します。新しいアプローチを有効にするには、ネイティブ・イメージに
--strict-image-heap
フラグを渡します。詳細および実装の詳細は、提案#4684を参照してください。新しいポリシーを満たさないビルドが、次のエラーで失敗すると、既知の問題が発生することに注意してください:ブール・オプションの値に使用できるのは+または-のみです
。これは、2023年10月17日のパッチ・リリースで解決され、今後のブログ投稿で、新しいポリシーとベスト・プラクティスの詳細を共有する予定です。 - ビルド時に登録せずに
Proxy
クラスの作成を試行した場合に、VMError
ではなく、MissingReflectionRegistrationError
をスローすることで、不足しているメタデータのレポートを改善しました。 - 最高のピーク・パフォーマンスを実現するために、最適化レベル3を
native-image
ビルダーに追加しました(GraalVM Community Editionでは使用できません)。この新しいレベルには、これまで最適化レベル2の一部であった最適化と、プロファイルに基づく最適化との組合せで最大の効果をもたらす最適化があります。その結果、デフォルトの-O2
を使用して構築する場合のコンパイル時間が大幅に短縮されます。また、--pgo
オプションにより、-O3
が自動的に有効化されます。 - ネイティブ・イメージに外部ダウン・コール(OpenJDKプロジェクトPanama)の試験的なサポートを追加しました。お試しの上、フィードバックをお送りください。今後、アップコールのサポートが予定されています。
-
ネイティブ・イメージ・ビルド・プロセスで使用されるスレッド数を制御するオプション
--parallelism
を追加しました。最小数は2です。このオプションは、リソースが制約された環境の構築に便利です。また、このリリース以降、ビルド・プロセスのメモリーおよびスレッドの制限がビルド出力に表示されます。例:Build resources: - 13.24GB of memory (42.7% of 31.00GB system memory, determined at start) - 16 thread(s) (100.0% of 16 available processor(s), determined at start)
- ビルド出力に色を付けるオプション
--color[=WHEN]
を追加しました。WHEN
をalways
、never
またはauto
に置き換えてください。このAPIオプションは、試験的なオプション-H:+BuildOutputColorful
より優先されます。 - ネイティブ・イメージの試験的なオプション(ホストされているオプションの大部分で、
-H:
で始まる)へのアクセスを明示的にロック解除する新しいオプション-H:±UnlockExperimentalVMOptions
を導入しました。アクセスが明示的にリクエストされない場合、試験的なオプションの使用を試行すると、このリリースでは、アクション可能なエラー・メッセージが表示されてビルドが失敗します。また、どの依存関係により、これらのオプションがリクエストされたのかをユーザーが把握できるよう、アクティブな試験的オプションが、ビルド出力の中にオリジンとともにリストされます。次のリリースでは、この警告は、ビルド失敗になります。一方、コミュニティでは、特定の試験的なオプションをパブリックAPIに昇格させて、安定しているとマークした方がよい場合は、問題をオープンすることが推奨されています。詳細は、GitHubの問題#7105を参照してください。 - 次のJDK 21の機能は使用できません:
デバッグおよびモニタリングの改善
- モニタリングの使用感の向上: Javaフライト記録
ThreadCPULoad
イベントのサポートを追加しました。(BellSoftと共同。) -XX:+HeapDumpOnOutOfMemoryError
のサポートを追加しました。(Red Hatと共同。)
変更ログの更新内容の完全なリストを参照してください。
GraalVM SDKのリファクタ
GraalVM SDKは、4つの細かいモジュールに分割されています。graalvm-sdk
モジュールの使用は、非推奨になりました。このリリースでは、すべてのGraalVM APIに互換性があります。次の新しいモジュールを使用できます:
org.graalvm.nativeimage
: 高度なユース・ケース向けのネイティブ・イメージのパブリックAPI。org.graalvm.polyglot
: ポリグロット言語実装をJavaに埋め込むことができるライブラリ。org.graalvm.word
: Javaのマシンワードサイズの値の下位レベル・ライブラリ。org.graalvm.collections
: GraalVMコンポーネントのコレクション・ライブラリ。
Mavenおよびモジュールの依存関係を適宜更新します。これまでに、ネイティブ・イメージのGraalVM SDKを次のように使用していた場合:
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>graal-sdk</artifactId>
<version>23.1.0</version>
</dependency>
今後は次のようにします:
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>nativeimage</artifactId>
<version>23.1.0</version>
</dependency>
ポリグロット埋込み機能では、次を使用できるようになりました:
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>polyglot</artifactId>
<version>23.1.0</version>
</dependency>
詳細は、ポリグロット埋込みの更新内容を参照してください。
GraalVM SDKの変更ログに、更新内容の完全なリストがあります。
ポリグロット埋込み
- すべてのGraalVM言語アーティファクトを、ポリグロット埋込み機能の標準Maven依存関係に変換しました(#6852を参照)。以前は、埋込みでGraalVM言語を使用するには、GraalVMアップデータ・ツール(
gu install python
など)を使用してインストールする必要がありました。現在では、言語を有効にするには、言語アーティファクトがJavaモジュールまたはクラス・パスにあることが必要です。 graalvm-sdk
モジュールの使用は非推奨になりました。かわりに、org.graalvm.polyglot:polyglot
アーティファクトを使用してください。org.graalvm.polyglot
モジュールは、GraalVM JDKにデフォルトで含まれないようになりました。Javaでの言語の埋込みを有効にするには、言語を依存関係として指定します。ポリグロット・アプリケーション用にTruffleツールが必要な場合は、ツールも依存関係で有効にします。次に、Maven構成の例を示します:<dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>polyglot</artifactId> <version>23.1.0</version> </dependency> <dependency> <groupId>org.graalvm.polyglot</groupId> <!-- Select the language --> <artifactId>js|python|ruby|wasm|llvm|java</artifactId> <version>23.1.0</version> <type>pom</type> </dependency> <dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>tools</artifactId> <version>23.1.0</version> <type>pom</type> </dependency>
これらの依存関係では、Oracle GraalVM上に構築された言語とツールが使用されます。GraalVM Community Editionバージョンを使用するには、
js-community
のように、artifactId
に接尾辞-community
を追加します。詳細は、更新された言語の埋込みに関するリファレンス・ドキュメントを参照してください。-
オプション
--language:<language>
(ビルド時に特定の言語ランタイムを有効にするためのもの)および次のマクロ・オプションを削除しました:--macro:polyglot-launcher --macro:polyglot-library --macro:truffle --macro:truffle-language-library
クラス/モジュールパスにこれらを配置すると、必要なことがすべて実行されるため、不要になりました。
その他の更新内容は、変更ログで確認できます。
JavaScriptおよびNode.js
- JavaScript (GraalJS)およびNode.jsランタイムをスタンドアロン・ディストリビューションとしてリリースしました。Oracle GraalVMとGraalVM Community Editionの両方で、ネイティブ・イメージ・コンパイル済ネイティブ・ランチャまたはJVMベースのランタイム(付属)の2つのスタンドアロン言語ランタイム・オプションを使用できます。これらを区別できるよう、GraalVM Community Editionバージョンの名前には、接尾辞
-community
が付いています(graaljs-community-<version>-<os>-<arch>.tar.gz
、graalnodejs-community-<version>-<os>-<arch>.tar.gz
)。JVMに付属するスタンドアロンの名前には、-jvm
接尾辞が付いています。スタンドアロン・ディストリビューションは、GitHubで入手できます。 - JavaScriptを実行するための
ScriptEngine
実装は、GraalVMに同梱されなくなりました。ScriptEngine
モジュールに明示的に依存するように設定を移行し、モジュール・パスに追加します。詳細は、ScriptEngineのドキュメントを参照してください。 - JavaScriptランタイムを有効にするには、
gu install js
を使用してインストールするのではなく(GraalVMアップデータが削除されているため)、Maven依存関係として追加(次を参照)するか、JARをモジュール・パスに明示的に配置します。JavaにJavaScriptを埋め込むためのMaven依存関係も更新されました。JavaScript埋込みのMaven構成を次に示します。<dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>polyglot</artifactId> <version>23.1.0</version> </dependency> <dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>js</artifactId> <version>23.1.0</version> <type>pom</type> </dependency>
これにより、Oracle GraalVMのJavaScriptランタイムが有効になります。かわりに、Communityライセンス・バージョンを使用するには、各アーティファクトに
-community
接尾辞を追加します(例:js-community
)。言語埋込みの依存関係設定を参照してください。 - ECMAScript 2023の機能をデフォルトで有効にしました。
- 新しい提案を実装しました:
- 非同期コンテキスト: 試験的なオプション
--js.async-context
の後ろで使用できます。 - String.dedent: ECMAScriptステージング・モードで、
--js.ecmascript-version=staging
オプションの後ろに使用できます。
- 非同期コンテキスト: 試験的なオプション
- Node.jsをバージョン18.17.1に更新しました。
その他の更新については、プロジェクトの変更ログを参照してください。
Java on Truffle
- Java on Truffle (Espresso)は、GraalVMに同梱されるのではなく、独立したスタンドアロン・ディストリビューションおよびMavenアーティファクトとして出荷されます。ネイティブ・ランチャを含むOracle GraalVMとGraalVM Community Editionの2つのスタンドアロン・オプションを使用できます。これらを区別できるよう、GraalVM Community Editionバージョンの名前には、
espresso-community-<version>-<os>-<arch>.tar.gz
のように、接尾辞-community
が付いています。Java on Truffleのスタート・ガイドを参照してください。スタンドアロン・ディストリビューションは、GitHubで入手できます。 - Java on Truffleを有効にするには、
gu install espresso
を使用してインストールするのではなく(GraalVMアップデータが削除されているため)、Maven依存関係として追加(次を参照)するか、JARをモジュール・パスに明示的に配置します。<dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>polyglot</artifactId> <version>23.1.0</version> </dependency> <dependency> <groupId>org.graalvm.polyglot</groupId> <artifactId>java</artifactId> <version>23.1.0</version> <scope>runtime</scope> <type>pom</type> </dependency>
これにより、Oracle GraalVMのJava on Truffleランタイムが有効になります。
- オプション
--enable-preview
を追加しました。
その他の更新については、プロジェクトの変更ログを参照してください。
LLVM
- GraalVM LLVMランタイムは、GraalVMに同梱されるのではなく、独立したスタンドアロン・ディストリビューションとして出荷されます。デフォルトで、LLVMツールチェーンが含まれています。Oracle GraalVMとGraalVM Community Editionの両方で、ネイティブ・イメージ・コンパイル済ネイティブ・ランチャまたはJVMベースのランタイム(付属)の2つのスタンドアロン言語ランタイム・オプションを使用できます。これらを区別できるよう、GraalVM Community Editionバージョンの名前には、
llvm-community-<version>-<os>-<arch>.tar.gz
のように、接尾辞-community
が付いています。JVMに付属するスタンドアロンの名前には、-jvm
接尾辞が付いています。LLVMのスタート・ガイドを参照してください。スタンドアロン・ディストリビューションは、GitHubで入手できます。 - LLVMツールチェーンをバージョン16.0.1に更新しました。
flang
ツールチェーン・ラッパーを追加し、埋め込まれたビットコードによるFortranのコンパイルを可能にしました。
ノート: LLVMツールチェーンは、Oracle GraalVM for JDK 23で削除するため非推奨とマークされています。
Truffle言語およびツールの実装
- Truffle言語およびツールの実装は、Javaモジュールベースの分離により、埋込み機能から分離されています。これは、内部APIが誤って使用されないように、Javaモジュールに移行されたことを意味します。Truffle言語およびインストゥルメントに必要なモジュラ化の詳細は、このドキュメントを参照してください。
- 実行に必要なアプリケーション・モジュール・パスからリソースを簡単にアンパックおよび消費できるよう、Truffle言語およびインストゥルメント用の内部リソースAPIを実装しました。このAPIは、言語ホームの概念に替わるものです。追加のファイルを実行する必要がある言語またはインストゥルメントの場合は、次のステップを実行する必要があります:
- 必要なファイルをスタンドアロン・ディストリビューション(JAR)にバンドルします。
- リソース・ファイルを解凍できるよう、
InternalResource
インタフェースを実装します。 - 言語またはインストゥルメントにバンドルされたリソース・ファイルが必要な場合は、
Env#getInternalResource
メソッドをコールします。このメソッドにより、リクエストされたInternalResource
が解凍され、解凍されたファイルを含むディレクトリが作成されます。内部リソースの解凍は負荷の高い操作になる可能性があるため、実装により、内部リソースが確実にキャッシュされます。
- Truffle言語またはインストゥルメントは、GraalVM JDKで
-Dtruffle.class.path.append
を使用して提供されていたときとは異なり、アプリケーション・モジュール・パスからロードされるようになりました。Truffleクラス・パスは非推奨であるため、使用しないでください。言語は、名前付きモジュールとしての実行を求められるようになったため、言語を移行する必要があります。言語は引き続きクラス・パスからロードできますが、Truffleでは独自のクラス・ローダーおよびモジュール・レイヤーに内部的に言語がロードされるため、モジュールにする必要があります。 - Ideal Graph Visualizerのダンプが使いやすくなりました:
- IRダンプ: Truffleのフォルダにコンパイル層が追加され、コンパイルを区別しやすくなりました。ダンプ・レベルが2以上の場合は、インラインIRグラフが別々のフォルダに追加でダンプされるようになりました。
- ASTダンプ: Truffle ASTが、IRダンプ・フォルダの一部としてダンプされるようになりました。現在では、ダンプされたASTツリーに、インライン化されたすべてのASTが1つのツリーで表示されます。個々の関数は、IGV (上部ステータス・バー)の「クラスタ・ノード」関数を使用してグループ化できます。現在では、ルート・ノードに名前が表示されます。すべてのASTノードにプロパティ
graalIRNode
があり、対応するGraal IR定数(存在する場合)を検索できるようになっています。
Truffleの変更ログに、更新内容の完全なリストがあります。