原文はこちら。
The original article was written by Alina Yurenko (Developer Advocate for GraalVM, Oracle Labs).
https://medium.com/graalvm/whats-new-in-graal-languages-24-2-328471fc4137
本日、GraalVM for JDK 24とともに、Graal Languagesの24.2をリリースしました。
Welcome, GraalVM for JDK 24!🚀
https://medium.com/graalvm/whats-new-in-graal-languages-24-2-328471fc4137
https://logico-jp.dev/2025/03/19/welcome-graalvm-for-jdk-24/
このバージョンはGraalVM for JDK 24と共に利用するために設計されていますが、GraalVM for JDK 21、Oracle JDK 21、OpenJDK 21の最新CPUリリースとも互換性があります。このリリースには多くのわくわくするアップデートが含まれています。例えばGradle plugin for GraalPy、Javaスレッド全体にスケールするネイティブPython、Espresso (Java on Truffle) でのContinuation API、新たなTruffle Bytecode DSLなどです。それでは見ていきましょう。
Graal Languages in Java ☕️
このリリースから、GraalPy、GraalJS、およびその他のGraal Languagesを利用する場合、JVMが表示する警告を回避するために、ネイティブアクセス権限を有効にする必要があります。モジュールパスを使用する場合は、javaランチャーに--enable-native-access=org.graalvm.truffleを渡し、クラスパスを使用する場合は、--enable-native-access=ALL-UNNAMEDを渡して、新たな警告に対処します。Graal Languagesが実装されているフレームワークのTruffleは、自動的にネイティブアクセス機能をすべてのロードされた言語およびツールに転送します。そのため、これ以上の設定は必要ありません。--illegal-native-access=denyでネイティブアクセスを拒否すると、最適化ランタイムが無効になり、代わりに遅いフォールバックランタイムを使用します。
ContextとEngineは、強参照でない場合、自動的にクローズされるようになりました。とはいえ、可能な限り明示的にクローズすることが推奨されます。
Class Context
https://www.graalvm.org/sdk/javadoc/org/graalvm/polyglot/Context.html
Class Engine
https://www.graalvm.org/sdk/javadoc/org/graalvm/polyglot/Engine.html
さらに、Value API が拡張されました。
Class Value
https://www.graalvm.org/sdk/javadoc/org/graalvm/polyglot/Value.html
ゲスト言語のバイトバッファ(Value#hasBufferElements())の内容を新しいバイト配列にコピーする機能として、Value#as(byte[].class) が追加されました。また、Value.fromByteBasedString(…) および Value.fromNativeString(…) を使用して、RAWバイト配列やネイティブ・メモリから文字列を作成できるようになりました。
Graal LanguageをNative Imageに埋め込む際、言語およびインストルメントリソースが自動的に含まれるようになりました。デフォルトでは、イメージの隣に個別のリソースフォルダが作成されなくなりました。詳細は、Embedding Languages guideを参照してください。
Embedding Languages
https://www.graalvm.org/jdk24/reference-manual/embed-languages/
GraalPy 🐍
前回のリリースでMaven plugin for GraalPyを追加した後、今回はさらに、GradleプロジェクトにGraalPyを簡単に組み込めるGradleプラグインも同梱しました!🎉
Getting Started with GraalPy on the JVM
https://www.graalvm.org/python/docs/
Javaプロジェクトに追加するには、次のようにします。
plugins {
application
id("org.graalvm.python") version "24.2.0"
}
graalPy {
packages = setOf("pygal==3.0.5")
}
GraalPyプラグインを使用する大きな利点のひとつは、使用したいPythonパッケージを簡単に構成できるようになる点です。
GraalPyの新リリースには、JavaにおけるPythonのパフォーマンスを大幅に向上させる2つの新しい実験的機能も含まれています。GraalPyは現在、異なるコンテキストでネイティブPython拡張を複数回ロードできますが、これにより、Javaスレッド全体にネイティブPythonを拡張できるようになります。この機能を使用するには、python.IsolateNativeModulesオプションを有効にし、GraalPyのマルチコンテキストモードを使用します(スレッドごとにGraalPyコンテキストを1つずつ使用することをお勧めします)。

2つ目の実験的な機能は、GraalPyに言語非依存のデータ表現であるApache Arrowを新たに統合したことです。これにより、JavaとPythonのオブジェクトレイアウトをコピーしなくても、大量のデータをJavaとPythonの間で直接共有できるようになりました。これにより、例えばPandasなどの一般的なPythonパッケージをJavaから使用する場合など、共有データの処理時間を大幅に短縮できます。

詳細は、ネイティブ拡張機能のドキュメントをご覧ください。また、この機能に関するガイドをデモリポジトリにも近々追加する予定です。
Native Extensions Support
https://github.com/oracle/graalpython/blob/master/docs/user/Native-Extensions.md
Add GraalPy Apache Arrow guide #15
https://github.com/graalvm/graal-languages-demos/pull/15
さらに、Pythonで外部の型がどのように扱われるかについても、いくつかの改善を行いました。
Interacting with foreign objects from Python scripts
https://github.com/oracle/graalpython/blob/master/docs/user/Interoperability.md#interacting-with-foreign-objects-from-python-scripts
外部オブジェクトには、相互運用特性に対応するPythonクラスが割り当てられるようになりました。これは、
- 例えばJavaの
MapオブジェクトやListオブジェクトは、それぞれPythonのdictやlistのサブクラスとして表される - Python側で期待されるすべてのメソッドが用意され、可能な限りPythonオブジェクトとして動作する
また、Python コードから呼び出された際に、指定の外部クラスに Python メソッドを追加するために polyglot.register_interop_type と @polyglot.interop_type を追加しました。これにより、外部インターフェースをよりPythonらしいものに適応させることが容易になります。最後に、Pythonコードで外部オブジェクトのメソッドを呼び出す際、Pythonメソッドが外部メンバーよりも優先されるようになりました。
このリリースにおけるすべての更新については、GraalPy の変更履歴をご覧ください。
Version 24.2.0
https://github.com/oracle/graalpython/blob/master/CHANGELOG.md#version-2420
GraalPyをより簡単に使い始められるように、いくつかの新しいデモとガイドを追加しました。ぜひお試しください。
| GraalPyを埋め込んだ小さなJavaアプリケーションの作成 | https://github.com/graalvm/graal-languages-demos/blob/main/graalpy/graalpy-starter |
| PythonパッケージをGraalPyで呼び出す | https://github.com/graalvm/graal-languages-demos/blob/main/graalpy/graalpy-openai-starter |
| JBangからPythonパッケージをGraalPyで呼び出す | https://github.com/graalvm/graal-languages-demos/blob/main/graalpy/graalpy-jbang-qrcode |
| MicronautアプリでGraalPyを使う | https://github.com/graalvm/graal-languages-demos/blob/main/graalpy/graalpy-micronaut-pygal-charts |
| Spring BootアプリでGraalPyを使う | https://github.com/graalvm/graal-languages-demos/blob/main/graalpy/graalpy-spring-boot-pygal-charts |
GitHubにはより多くのデモがあります。
GraalPy Demos and Guides
https://github.com/graalvm/graal-languages-demos/tree/main/graalpy?source=post_page—–328471fc4137—————————————
GraalJS and GraalWasm 🌍
Error.isError、Math.sumPrecise、Atomics.pause、Promise.try、base64やhexとUint8Array間の変換、RegExp.escape、Iteratorシーケンス、ソースフェーズインポート、正規表現パターン修飾子など、いくつかの ECMAScript提案を実装しました。
GraalJS は現在、WebAssembly/ES モジュール統合もサポートしており、Wasm モジュールをimport文で読み込むことができます。
ES Module Integration Proposal for WebAssembly
https://github.com/WebAssembly/esm-integration
これにより、例えば、WasmにコンパイルされたRust、Go、またはC++コードをJavaアプリケーションに埋め込むことがさらに容易になります。Rustライブラリの生成JavaScriptバインディングで使用されている例を以下に示します。このRustライブラリはGraalJSで動作します。
import * as wasm from "./photon_bg.wasm";
export * from "./photon_bg.js";
import { __wbg_set_wasm } from "./photon_bg.js";
__wbg_set_wasm(wasm);
wasm.__wbindgen_start();
We also updated the version of our Node.js runtime to 22.13.1.
Node.jsランタイムのバージョンを22.13.1に更新しました。
詳細については、GraalJSとGraalWasmの変更履歴をご覧ください。
GraalJS Changelog (Version 24.2.0)
https://github.com/oracle/graaljs/blob/master/CHANGELOG.md#version-2420
GraalVM WebAssembly (GraalWasm) Changelog (Version 24.2.0)
https://github.com/oracle/graal/blob/master/wasm/CHANGELOG.md#version-2420
Espresso ☕️
Truffleをベースに構築されたJavaランタイムであるEspressoに、新しい実験的な機能としてContinuation APIを追加しました。
Continuation API
https://www.graalvm.org/reference-manual/espresso/continuations/
このAPIを使用すると、実行中のプログラムを一時停止し、その状態を保存して、後で再開できます。ヒープオブジェクトをシリアル化して、同じコードを実行している別のJVMインスタンスで実行を再開できます(例えば、再起動後など)。
継続機能が特に有用なユースケースには、以下のようなものがあります。
- 投機的実行:CPU負荷の高い作業が長い待ち時間によってブロックされている場合に計算を高速化
Coroutines/Yieldの実装
Webリクエストの処理:グローバル変数やセッションストレージを使わずに、HTTPリクエスト間で状態を維持 - Undo/Redo機能:さまざまなポイントでアプリケーションの状態を記録し、アクションのUndo/Redoを可能にする
- 分散コンピューティング:継続状態をシリアライズし、分散システムで作業単位の移行を可能にする
- ライブプログラミング/ホットコードスワップ
Continuation APIを使い始めるには、org.graalvm.espresso:continuations:24.2.0をprovidedスコープで pom.xml/build.gradleに追加します。シリアライゼーションの例もご覧ください。
Serialization of Continuations
https://www.graalvm.org/reference-manual/espresso/continuations/serialization/
Espressoのその他の更新については、変更履歴をご覧ください。
Espresso Changelog (Version 24.2.0)
https://github.com/oracle/graal/blob/master/espresso/CHANGELOG.md#version-2420
TruffleRuby 💎
今回のリリースでは、TruffleRubyをRuby 3.3.5に更新し、C拡張のパフォーマンスを向上させるためにPanama NFIバックエンドに切り替えました。この新しいバックエンドにより、JVMモードでのより効率的なPanama upcallsにより、sqlite3、trio、jsonなどのC拡張は2倍から3倍高速になりました。
互換性の向上やバグ修正など、その他の更新については、変更履歴をご覧ください。
truffleruby ChangeLog
https://github.com/oracle/truffleruby/blob/master/CHANGELOG.md
Truffle Language Implementation Framework

Truffle上にバイトコードインタプリタを実装する作業を簡素化する新しいフレームワーク、Bytecode DSLを追加しました。
Package com.oracle.truffle.api.bytecode
https://www.graalvm.org/truffle/javadoc/com/oracle/truffle/api/bytecode/package-summary.html
これは、ASTのような仕様から、バイトコードインタプリタの複雑で面倒な詳細部分を生成することを目的としています。生成されたインタプリタは、tiered interpretation(段階的解釈)、bytecode quickening(バイトコードの書き換え)、boxingの排除、インストルメンテーション、continuations(継続)、シリアライゼーションなど、さまざまな機能に対応しています。さらに、生成されたコードには、インタプリタの速度とメモリ使用量を最適化するいくつかの機能が実装されています。今後、GraalPyやその他のGraal言語で新しいDSLを使用することを目指しています。もし使用したい場合は、私たちの広範なユーザーガイドとチュートリアルを参照してください。
Bytecode DSL user guide
https://github.com/oracle/graal/blob/master/truffle/docs/bytecode_dsl/UserGuide.md
Introduction to the Bytecode DSL
https://github.com/oracle/graal/blob/master/truffle/docs/bytecode_dsl/BytecodeDSL.md
Community and Ecosystem
GraalPyがあれば、JavaアプリケーションでPygalを使用してインタラクティブなSVGチャートを簡単に作成できます。MicronautとSpring Bootでの使用方法をご覧ください。
SVG Charts with GraalPy and Micronaut
https://github.com/graalvm/graal-languages-demos/tree/main/graalpy/graalpy-micronaut-pygal-charts
SVG Charts with GraalPy and Spring Boot
https://github.com/graalvm/graal-languages-demos/tree/main/graalpy/graalpy-spring-boot-pygal-charts
GraalPyとGraalWasmは、InfoQのJava 2024 Trends Reportでイノベーターとして紹介されています!
InfoQ Java Trends Report – December 2024
https://www.infoq.com/articles/java-trends-report-2024/
GraalPyを使用してJavaアプリケーションを拡張するためのベストプラクティスとヒントについては、Jfokusの講演をご覧ください。
TruffleプロジェクトのリーダーであるChristian Humer氏は、自身のポッドキャストairhacks.fmで、Adam Bien氏とGraalVM、Truffle、Futamura projections(二村射影)などについて語りました。
333 Pure Java Inception
https://airhacks.fm/#episode_333
Conclusion
この場を借りて、このリリースに貢献してくださった素晴らしいコントリビューターやコミュニティの皆さまに感謝いたします。
このリリースに対するフィードバックや、今後のリリースで実装してほしい機能に関するご意見があれば、Slack、GitHub、またはBlueSkyで共有してください。
Slack invitation
https://www.graalvm.org/slack-invitation
GitHub Issues
https://github.com/oracle/graal
BlueSky
https://bsky.app/profile/graalvm.org