原文はこちら。
The original article was written by Alina Yurenko (Developer Advocate for GraalVM, Oracle Labs).
https://medium.com/graalvm/whats-new-in-truffle-and-graal-languages-40027a59c401
本日、GraalVM for JDK 22とともに、TruffleとGraal言語の新バージョン、バージョン24.0もリリースしました。
Welcome, GraalVM for JDK 22!🚀
https://medium.com/graalvm/welcome-graalvm-for-jdk-22-8a48849f054c
https://logico-jp.io/2024/03/21/welcome-graalvm-for-jdk-22/
このバージョンは、JDK 22用のGraalVMで使用するために設計されていますが、LTSのGraalVM for JDK 21とも互換性があります。このリリースの中身を見てみましょう!
Polyglot Embedding
これは、Truffle Unchained以来のリリースなので、Unchainedによって導入された新しい後方互換機能を活用できます。
Truffle Unchained — Portable Language Runtimes as Java Libraries
https://medium.com/graalvm/truffle-unchained-13887b77b62c
https://logico-jp.io/2023/09/21/truffle-unchained-portable-language-runtimes-as-java-libraries/
つまり、このバージョンのTruffleとGraal言語(24.0)を、JDK 21用のGraalVMだけでなく、JDK 22用のGraalVMでも使用できるようになりました。
将来、TruffleとGraal言語の最新バージョンは、最新のLTSリリースと同様に、GraalVM JDKの最新バージョンとの互換性を維持する予定です。これはつまり、GraalVM JDKの現在のLTSリリースのままで、最新のPolyglot言語機能を使用できる、ということです。
下表は将来のバージョンにおける互換性を示したものです。
GraalVM for JDK 21でTruffleとGraal言語24.0を使用する場合は、最新バージョン(現在21.0.2)に更新する必要があることに注意してください。
また、Javaアプリケーションに他の言語を埋め込む方向けに、いくつかの変更を加えました。これらの新機能は次のとおりです。
配列アクセスを改善しました。Value#as(Collection.class)
を使用してゲスト言語の配列(Value#hasArrayElements()
)をJavaのCollectionインターフェイスにマッピングして配列要素にアクセスする機能を追加しました(ゲスト言語の配列をコピーしません)。詳細は以下のIssueを参照してください。
Python collections are not iterable as Java Collections #260
https://github.com/oracle/graalpython/issues/260
Interopバッファは、ホストアプリケーションのbyte[]
にマッピングされるようになりました。
FileSystems#allowLanguageHomeAccess()
メソッドは廃止され、代わりにFileSystem#allowInternalResourceAccess()
が導入されました。互換性を確保するため、両方のメソッドが言語ホームと内部リソースをサポートするようになりました。
その他の変更については、リリースノートとプロジェクトの変更履歴を参照してください。
GraalVM for JDK 22 release notes
https://www.graalvm.org/release-notes/JDK_22/
Change Log – Version 24.0.0
https://github.com/oracle/graal/blob/master/sdk/CHANGELOG.md#version-2400
GraalPy 🐍
Compatibility ✅
GraalPyでより多くのライブラリを利用できるように取り組んでいます。このリリースでは、以下のライブラリのサポートを拡張しました。
tensorflow
tensorflow-io
protbuf
llvmlite
pydantic-core
catboost
ray
readme-renderer
safetensors
keras
pybind11
grpcio
PyO3
cryptography
bcrypt
cramjam
libcst
orjson
rpds_py
ぜひお試しの上、フィードバックをお寄せください。そして、GraalPy上で動作させたい他のライブラリを教えてください。
Windowsとの互換性は、GraalPyのユーザーから最もリクエストの多い機能の1つであり、私たちは積極的に取り組んでいます。このリリースでは、Windows上でネイティブの拡張機能を持つパッケージをインストールするためのサポートを追加しました。
GraalPy as a CPython Replacement
https://www.graalvm.org/latest/reference-manual/python/Python-Runtime/
GraalPy on GitHub Actions 🚀
GitHub Actionのsetup-python
でGraalPyを使えるようになりました。設定方法は以下の通りです。
- name: Setup GraalPy
uses: actions/setup-python@v5
with:
python-version: graalpy # or graalpy24.1 to pin a version
また、GraalPy上で人気のあるネイティブ拡張機能をビルドするためのレシピをGitHub Actionsの形で提供します。このレシピでは、コミュニティ向けに正しい依存関係でGraalPyのネイティブ拡張機能をビルドするための再現可能な方法を提供します。
Scripts to build wheels for GraalPy
https://github.com/oracle/graalpython/blob/master/scripts/wheelbuilder/README.md
開発者体験に関する別のニュースでは、JavaからJBang経由でGraalPyを簡単に試すこともできます。
コマンドラインから直接スクリプトを実行できます。
jbang hello@oracle/graalpython/release/graal-vm/24.0 "print('Hello GraalPy!')"
JavaにPythonを組み込むより高度な例については、以下のサンプルプロジェクトをご覧ください。
Use GraalPy in a Java embedding with JBang
https://github.com/timfel/graalpy-jbang
また、GraalVM LLVMランタイム(Sulong)の代わりにシステムツールチェインを使用するように切り替えました。これにより、デフォルトの構成でのフットプリントが減り、C拡張をネイティブに実行するようになります。
すでにGraalPyを使用している場合、もしくはGraalPy初心者であればなおのこと、GraalPyクイックリファレンスをどうぞ。非常に役立つと思います。
GraalPy Quick Reference
https://medium.com/graalvm/graalpy-quick-reference-0488b661a57c
https://logico-jp.io/2023/11/10/graalpy-quick-reference/
相互運用性に関していくつかの変更があります。詳細はリリースノートをご覧ください。
GraalVM for JDK 22 release notes
https://www.graalvm.org/release-notes/JDK_22
JavaScript and Node.js
非同期イテレータヘルパー (Async Iterator Helpers)、JSON.parse
のソーステキストアクセス (JSON.parse source text access)、Well-Formed Unicode Strings、WebAssemblyスレッドなど、いくつかの新しい提案を実装しました。
Async Iterator Helpers : Methods for working with async iterators in ECMAScript
https://github.com/tc39/proposal-async-iterator-helpers
Proposal for extending JSON.parse to expose input source text.
https://github.com/tc39/proposal-json-parse-with-source
a proposal for a method to determine if a String is welll-formed Unicode
https://github.com/tc39/proposal-is-usv-string
Threads and Atomics in WebAssembly
https://github.com/WebAssembly/threads
また、Node.jsでのWebAssemblyサポートがデフォルトで有効になりました。実験的なオプション--js.webassembly=false
を使用すると無効にできます。
TruffleRuby
C/C++拡張はシステムツールチェインを使用してコンパイルされ、GraalVM LLVMランタイム (Sulong) ではなくネイティブで実行されるようになりました。これにより、起動が速くなり、ウォームアップがなくなり、互換性が向上し、配布が小さくなり、C/C++拡張のインストールが速くなりました。
古いパーサーより約2倍高速なPrismパーサーを採用することで、Ruby 3.2とRuby 3.3の構文(パターンマッチングを含む)を完全にサポートするようになりました。
Prism Ruby parser
https://github.com/ruby/prism
その他の変更点は TruffleRuby リリースノートを参照してください。
Truffle Ruby Release Notes
https://github.com/oracle/truffleruby/releases/tag/graal-24.0.0
Community and Ecosystem
Oracle Database に GraalVM を組み込み、JavaScript などの Graal 言語をデータベース内で実行できるようにした MLE (Multilingual engine) についてはご存知かもしれません。JavaScript実行のための同様のモジュールは、現在MySQLでも利用可能です。
Introducing JavaScript support in MySQL
https://blogs.oracle.com/mysql/post/introducing-javascript-support-in-mysql
Appleは最近、新しい設定言語Pklをオープンソース化しました。これは Truffle フレームワーク 🚀 上に構築されています。
Pkl – A configuration as code language with rich validation and tooling.
https://github.com/apple/pkl
TornadoVMを使って、GPU上でPolyglot GraalVM アプリケーションを高速化できます。
Hardware Acceleration for Polyglot Runtimes
https://www.tornadovm.org/post/hardware-acceleration-for-polyglot-runtimes
PolyglotアプリケーションのビルドにIntelliJ IDEAを使用している場合、アノテーションやコメントによって各言語のシンタックス・ハイライトを有効にする簡単な方法があります。IDEAでサポートされているすべての言語で動作します。
Conclusion
この場を借りて、このリリースに寄せられたフィードバック、提案、貢献に対して、素晴らしい貢献者とコミュニティに感謝いたします。
このリリースに対するフィードバックや、今後のリリースで見てみたい機能の提案がありましたら、Slack、GitHub、Twitterで共有してください。
Slack invitation
https://www.graalvm.org/slack-invitation
GitHub Issues
https://github.com/oracle/graal
Twitter
https://twitter.com/graalvm