GraalVM 21.0: Introducing a New Way to Run Java

原文はこちら。
The original entry was written by Oleg Šelajev (Developer advocate for GraalVM at Oracle Labs).
https://medium.com/graalvm/graalvm-21-0-introducing-a-new-way-to-run-java-df894256de28

本日GraalVM 21.0のリリースを発表いたしました。

冬休みに入ってからの短い開発期間でしたが、GraalVMエコシステム全体にて多くの改善点や新しいエキサイティングな機能を提供しています。

毎回のリリースと同様、素晴らしいGraalVMコミュニティの皆様からのフィードバックやコラボレーション、問題のディスカッション、pull requestの送付、そしてとりわけGraalVMプロジェクトとGraalVMプロジェクトがどのように役立つのか、という情報を広めてくださり、非常に感謝しております。ぜひいっしょにGraalVMを素晴らしいものにしていきましょう。

GraalVM 21.0は今すぐダウンロードいただけます。

GraalVM
https://www.graalvm.org/downloads/
GraalVM Enterprise
https://www.oracle.com/downloads/graalvm-downloads.html

このエントリではGraalVM 21.0における最も注目すべき変更点をご紹介します。GraalVMには多くのコンポーネントがあり、すべてのリリースで改善や修正が行われています。より詳細な変更点のリストについては、リリースノート、または各コンポーネントの変更ログをご確認ください。

GraalVM 21.0 Release Notes
https://www.graalvm.org/release-notes/21_0/

Platform Updates

いつも通り、このリリースではGraalVMビルドで利用しているJDKのバージョンが上がり、以下のようになっています。

  • GraalVM Community Edition
    • OpenJDK version 1.8.0_282
    • OpenJDK version 11.0.10
  • GraalVM Enterprise
    • Oracle JDK version 1.8.0_281
    • Oracle JDK version 11.0.10

Java on Truffle

GraalVM 21.0で追加された最もわくわくする機能は、Java on Truffleを実装する新しいコンポーネントです。Java on Truffleは、Truffleフレームワークを使って実現したJVMです。

Truffle Language Implementation Framework
https://www.graalvm.org/graalvm-as-a-platform/language-implementation-framework/

Java on Truffleは現在experimentalですが、初期のリリース状態においても、非常に興味深い機能を提供します。これを使うことで、他のすべてのGraalVM言語にパワーを供給するインフラを通じてJava(および他のJVM言語)を実行できます。

gu install espresso でインストールし、お気に入りのJavaアプリケーションを java -truffle で実行してみてください。

Java on Truffleの詳細を知りたい方は、以下の記事で詳しく説明しています。この中で、詳細だけでなく、動機やユースケース、Java on Truffleを使って実験できることなどを紹介しています。

Java on Truffle — Going Fully Metacircular
https://medium.com/graalvm/java-on-truffle-going-fully-metacircular-215531e3f840

Native Image

ネイティブイメージのバイナリでJavaのシリアライズが利用可能になりました。シリアライズの使用法は、他の動的機能と同様に設定する必要があり、シリアライズ/デシリアライズ可能なクラスはビルド時にわかっている必要があります。設定はjavaagentを用いるアシスト付き設定を使って生成できるので、一から設定を作成する必要はありません。

Assisted Configuration of Native Image Builds
https://www.graalvm.org/reference-manual/native-image/BuildConfiguration/#assisted-configuration-of-native-image-builds

例えば、次のようなクラスがあるとします。

import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream;
public class Main {
private static String filename = "fib1000";
static Stream<Long> fibonacciStream() {
return Stream.iterate(new long[]{1, 0}, (f) -> new long[]{f[0] + f[1], f[0]}).map(f -> f[0]);
}
public static void main(String[] args) throws Exception {
List<Long> fib1000 = fibonacciStream().limit(1000).collect(Collectors.toList());
try (ObjectOutputStream oss = new ObjectOutputStream(new FileOutputStream(filename))) {
oss.writeObject(fib1000);
}
Object deserializedFib1000;
try (ObjectInputStream oss = new ObjectInputStream(new FileInputStream(filename))) {
deserializedFib1000 = oss.readObject();
}
System.out.println(fib1000.equals(deserializedFib1000));
}
}
view raw Main.java hosted with ❤ by GitHub

このクラスはシリアライズ、デシリアライズをして、フィボナッチ数を出力します。javaagentをつけてコンパイル、実行できます。

javac Main.java
java -agentlib:native-image-agent=config-output-dir=config/META-INF/native-image Main

configディレクトリには、シリアライズのためにどのクラスが含まれるかを示すJSONファイルがあります。

cat config/META-INF/native-image/serialization-config.json 
[{   "name":"java.lang.Long"        },   
 {   "name":"java.lang.Number"      },   
 {   "name":"java.util.ArrayList"   } 
]

あとは以下のコマンドを実行すればネイティブイメージをビルドできます。

native-image -cp .:config Main

すると、生成されたネイティブイメージを実行すると、フィボナッチ数のリストをシリアライズ、デシリアライズします。

これに加え、ネイティブイメージ機能をより多くのJavaプログラマーが以前よりもはるかに簡単に利用できるようにする、非常に重要な変更が入りました。その変更とは、21.0でメソッドハンドルの呼び出しサポートが改善されました。メソッドハンドルのユースケースのほとんどで機能するはずです。設定は必要ですが、トレーシング・エージェントを使って設定を作成することもできます。

構成エージェントについて言うと、構成エージェントを使って作成した構成を使えば、Linux上でAWTアプリケーションやSwingアプリケーションのネイティブイメージをビルドできるようになりました(experimentalです)。他のプラットフォームはまだサポートされていませんが、素晴らしい第一歩です。

Truffle

Truffleインタプリタのホストコンパイルにおける最適化をガイドするディレクティブのためのHostCompilerDirectivesアノテーションがTruffleに追加されました。

HostCompilerDirectives.BytecodeInterpreterSwitchバイトコードインタプリタでinstruction-dispatchスイッチを含むメソッドを示す
HostCompilerDirectives.BytecodeInterpreterSwitchBoundaryバイトコードインタプリタのスイッチにインライン化する必要のないメソッドを示す

JavaScript

GraalVMのNode.jsは12.20.1にアップデートされています。

互換性は常に最優先事項であり、このリリースでは以下のECMAScript 2021 mode/featuresがデフォルトで有効になっています。

  • Class フィールド
  • Promise.any
  • String.prototype.replaceAll
  • 論理代入演算子 (Logical Assignment Operators)

さらに、--js.ecmascript-version=2022 オプションで有効化されたECMAScript 2022モードでJavaScriptエンジンを実行すると、提案中のrelative indexing method(相対インデックス作成メソッド)の実装も利用できます。

Relative Indexing Method
https://tc39.es/proposal-relative-indexing-method/

Ruby

GraalVM 21.0では、Ruby実装はRuby 2.7.2との互換性を目標にしています。Ruby2.7.2のほとんどの機能や変更は実装済みです(詳細はGitHubの以下のIssueをご覧ください)。

Ruby 2.7 support #2004
https://github.com/oracle/truffleruby/issues/2004

これに加え、このリリースを開発している短期の間にパフォーマンスの改善がありました。特に、MatchData#lengthArray#sampleString#inspectのようなメソッドがより効率的になりました。

特殊変数 $~ に関わる問題も修正済みです。

Truffle::Interop 配下のいくつかの interop メソッドの名前が、InteropLibrary (#2139) の命名に合わせて変更されました。

Some Truffle::Interop methods have inconsistent names #2139
https://github.com/oracle/truffleruby/issues/2139

新しいバージョンのIRBでは、コードをコピー/ペーストするときに非常に遅くなることに注意してください。これは非効率な io/consoleの実装によるもので、次のリリースで対処する予定です。回避策として irb --readline を使ってください。これによりいくつかの IRB 機能が無効化されますが、コードをコピー/ペーストする際にかなり高速になります。

Python

チームはPythonネイティブライブラリとJythonの実装の両方との互換性に引き続き取り組んでいます。例えば、21.0ではJythonとの互換性のためにjarrayモジュールを追加しました。

jarray
https://www.javadoc.io/static/org.python/jython/2.7.2/org/python/modules/jarray.html

また、特定の設定でNumPyを実行した場合のメモリリークやクラッシュを回避するための修正や、Pandasのサポートの改善も行われています。

パフォーマンスの更新やその他の修正の詳細については、リポジトリの変更ログをチェックしてください。

Python Changelog – Version 21.0.0
https://github.com/oracle/graalpython/blob/master/CHANGELOG.md#version-2100

LLVM bitcode runtime

LLVMビットコードランタイム実装の主要な改善領域の1つは、ウォームアップです。21.0では、AST共有(1つのエンジン内の複数のコンテキスト間でプログラムの内部表現を共有する)だけでなく、補助エンジンキャッシングのサポートも導入しました。AST共有の機能に加えて、補助エンジンのキャッシングにより、プロセスの境界を越えて共有されたコードを永続化することが可能になりました。

GraalWASM

WebAssemblyインタプリタが時々目立たないように行動していますが、それをより良く、より速く、より安全にするために常に活発な作業が行われています。21.0では Graalwasmインタプリタを最適化し、ウォームアップを改善し、WebAssemblyインタプリタの全体的なピークパフォーマンスを最大20倍高速化しました。また、公式のWebAssembly仕様スイートのほとんどに合格しており、現在は残存するいくつかのマイナーなエッジケースの修正に取り組んでいます。

Tools

GraalVM 21.0以降、guユーティリティがより強力になり、ローカルのGraalVMインストールを新しいバージョンにアップデートしたり、Community EditionからEnterprise Editionにアップグレードしたりできるようになりました。詳細はドキュメントをご覧ください。

Upgrade GraalVM
https://www.graalvm.org/reference-manual/graalvm-updater/#upgrade-graalvm

また、GraalVM 21.0リリースの一環として、GraalVM Extension Pack for Visual Studio Codeを発表いたします。Technology Previewリリースではありますが、VS Code環境でのJava 8+、JavaScript、Python、Ruby、R、Micronautの生産性を向上させるための多くの機能を提供しています。Extension PackはVisual Studio Code Marketplaceですぐに利用可能で、VS Codeからすぐにインストールできます。Extensions: Marketplaceビューで GraalVMと入力し、GraalVM Extension Packを選択し、インストールボタンをクリックするだけです。インストール中、別の記事にあるVS Code拡張機能の詳細をお読みいただくこともできます。

GraalVM 21.0 VS Code Extensions Released
https://medium.com/graalvm/graalvm-21-0-vs-code-extensions-released-ab196354faeb

これらはGraalVM 21.0での改善点の一部に過ぎないことにご注意ください。新機能や注目すべき機能の詳細な概要については、リリースノートをお読みください。そして最も興味を持っているコンポーネントについては、変更ログが非常に貴重な情報源です。

以前も述べた通り、GraalVM 20.3.1とGraalVM Enterprise 20.3.1はこれまで通りダウンロードできます。

GraalVM 20.3.1
https://www.graalvm.org/downloads 
GraalVM Enterprise 20.3.1
https://www.oracle.com/downloads/graalvm-downloads.html

今すぐアップグレードする予定がないとしても、本当に素敵な機能がエコシステムに追加されましたので、バイナリを入手してJava on Truffleを試してください。。

Java on Truffle
https://www.graalvm.org/java-on-truffle

ご意見やフィードバックがありましたら、遠慮なくお知らせください。Slack、GitHub、Twitterのいずれかを使ってGraalVMチームにコンタクトしてください。

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

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中