What’s New in GraalVM Languages

原文はこちら。
The original article was written by Alina Yurenko (Developer Advocate for GraalVM, Oracle Labs).
https://medium.com/graalvm/whats-new-in-graalvm-languages-161527df3d76

本リリースでは多数のアップデートがあるので、ブログエントリを2個に分けました。このエントリではGraalVM言語とTruffleのアップデートにフォーカスします。GraalVM JDKやNative Imageの新機能については、関連する対になるブログエントリをご覧ください。

A New GraalVM Release and New Free License!
https://medium.com/graalvm/a-new-graalvm-release-and-new-free-license-4aab483692f5
https://logico-jp.io/2023/06/15/a-new-graalvm-release-and-new-free-license/

Oracle GraalVM

新たなディストリビューションであるOracle GraalVMをご紹介します。これはGraalVM Free Terms and Conditions (GFTC) ライセンスの下で利用可能なディストリビューションです。

GraalVM Free Terms and Conditions (GFTC) license
https://oracle.com/downloads/licenses/graal-free-license.html
FAQ
https://oracle.com/java/technologies/javase/jdk-faqs.html#GraalVM-licensing

ユーザーにとっては、これは以下を意味します。

  • 開発目的、社内運用利用目的であれば無料(訳注:FAQのWhat are the restrictions on the “GFTC”?に記載があります)
  • コマンドラインやスクリプトで簡単にダウンロードし、CI/CDパイプラインに統合できる
  • Oracle JDKに準拠した長期サポートリリース(Long-term support release)

Oracle GraalVMに関する詳細とOracle GraalVMがもたらすものについては、以下のエントリをご覧ください。

A New GraalVM Release and New Free License!
https://medium.com/graalvm/a-new-graalvm-release-and-new-free-license-4aab483692f5
https://logico-jp.io/2023/06/15/a-new-graalvm-release-and-new-free-license/

What’s new in GraalPy 🐍

GraalPy on Windows

GraalPyがWindowsで動作するようになりました🎉。基本的なワークロードをWindowsでビルド、実行できます。スタンドアロンであっても、Javaに埋め込んでもかまいません。開始するには、以下のガイドをご覧ください。

GraalPy, the GraalVM Implementation of Python
https://github.com/oracle/graalpython#readme

Standalone Python Applications

GraalPyを使えば、Pythonアプリケーションやライブラリを、外部依存関係を持たないスタンドアロンのライブラリもしくはJARファイルとして配布できます。GraalPyの基礎となるTruffleフレームワークならびにGraalPyがPythonのネイティブ拡張をマネージド実行 (managed execution) するために活用しているSulong LLVMランタイムにより、標準ライブラリやインストールされたパッケージへのアクセスを含む、すべてのファイルシステムへのPythonアプリケーションのアクセスを仮想化します。

The Truffle Language Implementation Framework
https://github.com/oracle/graal/tree/master/truffle
Sulong
https://github.com/oracle/graal/tree/master/sulong

これで、次のようにスタンドアロンの実行ファイルをビルドできるようになりました。

graalpy -m standalone binary - module my_script.py - output my_binary

GraalVM上で動作し、GraalPyを含むJARファイルの場合はこちら。

graalpy -m standalone java - output-directory MyJavaApplication - module my_script.py

Compatibility and Performance

デフォルトで完全なネイティブ実行を使用するPython C APIインターフェースの新しい実装を追加しました。これにより、ネイティブコードで多くの時間を費やす一部の拡張機能のパフォーマンスと互換性を改善しますが、Pythonとネイティブコードの間を頻繁に行き来するワークロードでは悪影響を及ぼす可能性があります。拡張機能のビルドと実行方法を制御する新しいオプションが追加されています。

  • python.NativeModules
  • python.UseSystemToolchain

この新しいデフォルト構成では、GraalVMに同梱されているLLVMツールチェーンではなく、拡張機能の構築にホストシステムのツールチェーンを使用し、すべてのモジュールをネイティブに実行します。

GraalPyのパフォーマンスについて知るには、GraalPyのページにある更新された数字を見てみてください。これらは、コミュニティのpyperformanceベンチマーク・スイートに基づいているので、実装間でこれらの数字を簡単に比較できます。

Python
https://graalvm.org/python/
The Python Performance Benchmark Suite
https://pyperformance.readthedocs.io

Geomean speedup of GraalPy over CPython on the Python Performance suite
  • numpypandasのバージョンを更新し、ginstallscipyscikit_learnをサポートするようになりました。
  • 言語バージョンと標準ライブラリを3.10.8に更新し、より新しいモジュールやパッケージと互換性を持たせました。
  • asyncioの初期サポートを追加しました。完全ではありませんが、これにより、aiofilesのようないくつかの非同期ライブラリがすでに動作するようになっています。
  • virtualenvのGraalPyプラグインを組み込みモジュールとして追加し、GraalPy上でvirtualenvを使った仮想環境をすぐに作成できるようにしました。

virtualenv
https://virtualenv.pypa.io

TruffleRuby

TruffleRuby を Ruby 3.1.3 にアップデートしました。また、外部のbig integerをサポートし、すべての Numeric演算子で機能するようになりました。

また、パフォーマンスを向上させるためにいくつかの変更を加えました。

  • YAMLを解析する際のウォームアップを改善するため、psychにシステムのlibyamlを使用するようにしました。
  • オブジェクトにラップされたネイティブ構造体のマーク付けが、C call exitで行われるようになり、メモリのオーバーヘッドが軽減されました。
  • cloneUninitialized()の実装によって、コールターゲットの分割(コピー)が最適化されました。
  • Process.pid$$のようにプロセスごとにキャッシュされるようになりました。

このリリースにおけるその他の TruffleRuby の更新は、プロジェクトの変更履歴でご覧ください。また、本リリースに多くの貢献をいただいたShopify社に感謝します。

CHANGELOG (22.3.0)
https://github.com/oracle/truffleruby/blob/master/CHANGELOG.md#2230

vm-23.0.0: [GR-45794] TruffleRuby EE standalone includes Sulong Enterprise
https://github.com/oracle/truffleruby/releases/tag/vm-23.0.0

GraalJS and Node.js

Node.jsのバージョンを18.4.1にアップデートしました。他にも、BigIntegerの相互運用性サポートを追加しています。外部のBigIntegerでは、JavaScriptのBigIntセマンティックスを選択するよう、BigInt関数を使う明示的な型のキャストが必要である点にご注意ください。デフォルトのセマンティクスは、元の値や型に関係なく、すべての外部の数値をJavaScriptのNumber値のように扱います。その他、新しいECMAScriptの提案も一部実装しました。すべての変更はプロジェクトの変更履歴をご覧ください。

JS BigIntセマンティクスを選ぶために、BigInt関数を使用して明示的に型キャストする必要があることに注意してください。デフォルトのセマンティクスは、元の値や型に関係なく、すべての外国の数値をJavaScriptのNumber値のように扱います。また、いくつかの新しい ECMAScript の提案も実装しました。すべての変更はプロジェクトの変更ログでご覧ください。

GraalVM JavaScript (Graal.js) Changelog (23.0.0)
https://github.com/oracle/graaljs/blob/master/CHANGELOG.md#version-2300

Polyglot Sandboxing

GraalVMでは、Polyglot Embedding APIを使って、他言語で書かれたコード(ゲストコード)をJavaアプリケーションで実行できます。

Embedding Languages
https://graalvm.org/dev/reference-manual/embed-languages/

この新しいリリースでは、ゲストコードの権限を制限するサンドボックスポリシーを設定できるようになりました。Polyglot Sandboxingの恩恵を受けるユースケースには以下のようなものがあります。

  • サードパーティの依存関係の実行
  • ユーザー・プラグイン
  • サーバースクリプトの実行

以下のポリシーから選択できます。

trusted完全に信頼できるゲスト・コードを想定(デフォルトのモード)
constrainedホストリソースへのアクセスを規制
【例】ホストのファイルやソケットへのアクセスは禁止
isolatedホストとゲストコードの間をさらに分離し、レジリエンシーを強化
ゲストコードは、独自のガベージコレクタとJITコンパイラを備えた別のヒープで実行
untrusted信頼されていないゲストコードが対象
投機的実行攻撃などを軽減する目的で、サンドボックスではコンパイラとランタイムレベルで追加のハードニング機構を採用

Polyglot Sandboxingは現時点でJavaScriptで利用可能ですが、今後のリリースで利用可能な言語を増やす予定にしています。詳細は以下のガイドをご覧ください。

Polyglot Sandboxing
https://graalvm.org/dev/security-guide/polyglot-sandbox/

Truffle Language and Tool Implementations

Truffle DSLのパフォーマンスを向上させるために、いくつかの新機能を実装しました。特に、新しい@GenerateInlineアノテーションにより、Truffleノードが自動的にオブジェクトインライン化され、結果メモリフットプリントが削減し、インタプリタの実行速度が向上しています。詳細についてはドキュメントを、その他の更新についてはプロジェクトの変更履歴を参照してください。

Truffle DSL Node Object Inlining
https://github.com/oracle/graal/blob/master/truffle/docs/DSLNodeObjectInlining.md
Truffle Changelog (23.0.0)
https://github.com/oracle/graal/blob/master/truffle/CHANGELOG.md#version-2300

Polyglot Embedding

java.lang.BigIntegerをPolyglot Value APIに追加しました。デフォルトでは、java.lang.BigInteger型のすべてのホスト値が数値値として解釈されるようになりました(Value.isNumber())。なお、long値に収まらない数値を解釈するための言語サポートは異なる場合がある点に注意が必要です。一部の言語(例えばJavaScript)では、ホストのbig integerの明示的な変換が必要になる場合があります。Ruby や Python などの他の言語では、明示的な変換を行わずにbig integerを使用できます。ゲスト言語をまたいで渡される値も同様です。

Conclusion

この機会に、このリリースに寄せられたすべてのフィードバック、提案、貢献に対して、コミュニティに感謝したいと思います。このリリースに関する追加のフィードバックや、今後のリリースで見たい機能の提案があれば、Slack、GitHub、またはTwitterでお知らせください。

Slack invitation
https://www.graalvm.org/slack-invitation
GitHub Issues
https://github.com/oracle/graal
Twitter
https://twitter.com/graalvm

新しいGraalVMを試してみてください!🚀

Download GraalVM
https://graalvm.org/downloads/

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください