一体何モノなの? GraalVM入門編 / GraalVM for beginners

36bb9dcd778d2a9621d44e92425d0907?s=47 hhiroshell
September 19, 2019

一体何モノなの? GraalVM入門編 / GraalVM for beginners

Oracle Cloud Hangout Cafe(OCHaCafe) Season 2 #2 での発表資料です。
https://ochacafe.connpass.com/event/140792/

GraalVMの入門者向けの解説。

36bb9dcd778d2a9621d44e92425d0907?s=128

hhiroshell

September 19, 2019
Tweet

Transcript

  1. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 一体何モノなの? GraalVM入門編 茂 こと | @cotoc88 / 早川 博 | @hhiroshell 日本オラクル株式会社 クラウド事業戦略統括 ソリューション・エンジニア Oracle Cloud Hangout Cafe - Season2 #2
  2. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Safe Harbor Statement The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, timing, and pricing of any features or functionality described for Oracle’s products may change and remains at the sole discretion of Oracle Corporation. 2
  3. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 目次 1. イントロダクション - GraalVMって何モノ? 2. 技術詳説 - GraalVMをもっと深く知ろう 3. 無限に広がるユースケース - GraalVMを使ってみよう 4. おまけ - GraalVMについてのよくある質問 3
  4. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 目次 1. イントロダクション - GraalVMって何モノ? 2. 技術詳説 - GraalVMをもっと深く知ろう 3. 無限に広がるユースケース - GraalVMを使ってみよう 4. おまけ - GraalVMについてのよくある質問 4
  5. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | GraalVMとは • プログラミング言語のランタイムのひとつ • Oracle主導で開発されているOSS (Community Edition) – The GNU General Public License (GPL) V2 下において自由に利用可能 – https://github.com/oracle/graal • Graal(JITコンパイラ)やTruffleを持つ多言語に対応したJVM
  6. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | GraalVMでできることの例 • 単一のランタイムで複数種のプログラミング言語を動かせる • サイズの小さい(数十MB~)JVMアプリコンテナを作ることができる • SQL文でJavaScriptのライブラリを使った処理を記述する 6
  7. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | GraalVMの3つの側面 • 単一のランタイムで複数種のプログラミング言語を動かせる → 1. プログラミング言語ランタイム • サイズの小さい(数十MB~)JVMアプリコンテナを作ることができる → 2. シングルバイナリ(Native Image)生成装置 • SQL文でJavaScriptのライブラリを使った処理を記述する → 3. 組み込みランタイム 7 GraalVMの利用形態には大きく3通りがある
  8. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 1. 複数言語サポート – Javaを始めとした複数のプロ グラミング言語を実行可能 • Java | JDK8互換 • JavaScript | ECMAScript 2019 互換 • JVM言語(Scala、Groovy、 Kotlin…) • Python, Ruby, R, C, C++… 2. Polyglot(異種混在) – 言語の境界を超え、単一プ ログラム内で、複数言語を 絡めた記述が可能 • Rで記述されたコードブロック をJavaScriptから実行する など 8 3. ハイパフォーマンス – 新しいJITコンパイル技術に よりアプリケーションの実行 を高速化 1. プログラミング言語ランタイムとしてのGraalVM Java仮想マシンのようなプログラミング言語ランタイムとしての利用方法
  9. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 2. Native Image生成装置としてのGraalVM Javaバイトコードをコンパイルしシングルバイナリ(=Native Image)化する機能 • アプリケーションを事前にマシン語にコンパイル(AOT: Ahead of Time Compilation)し、 ランタイムと合わせたシングルバイナリを生成する – ランタイムの起動時間、及びプログラム実行初期のパフォーマンスの劇的な向上 – メモリフットプリントの極小化 – アプリケーションのランタイムを共有しないことによるセキュリティの向上 9 HotSpot Compiler Interface C2 (for Server) Javaアプリ native-image Javaアプリ(マシン語) + ランタイム シングルバイナリ
  10. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | • 製品への組み込み – Oracle DBなどの製品に製品固有の言 語(SQLやPL/SQL)以外の言語を実行 可能にする – Oracle Multilingual Engine (Oracle MLE) ※実験的機能 • Oracle DBでJavaScriptのコードを内包するス トアド・ファンクションやPL/SQLを記述するこ とができる • https://oracle.github.io/oracle-db-mle/ • OpenJDKへの組み込み – OpenJDKにJVM言語以外の実行する 機能を持たせる • GraalVM Polyglot APIを使用し、 JVMベースのホストアプリケーションにゲスト 言語のコードを組み込み実行可能 10 3. 多言語実行を様々な環境に組み込むGraalVM GraalVMを様々な環境に組み込んで多言語対応の拡張を行う public static void main(String[] args) { System.out.println("Hello World: Java!"); Context context = Context.create(); context.eval( "js", "print('Hello World: JavaScript!’);” ); } ↑ JavaScriptのコードブロック 例:Javaコード内でJavaScriptで記述
  11. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | GraalVMの2つのエディション • GraalVMはCommunity Edition(CE)と Enterprise Edition(EE)の2種類を提供 – CEはOpenJDK 1.8.0_222、EEはJava SE 1.8.0_221ベース • Enterprise Editionはより企業向けに 重要な改良が行われている – パフォーマンスの向上とメモリ・フットプリント の削減による効率性の向上 – セキュリティ機能の拡張 – 24時間365日サポート 11 ※Windowsは2019/9 現在実験的サポート https://www.graalvm.org/downloads/ GraalVM EEを使用する場合は通常年間のサブスクリプション契約が必要 でも Oracle CloudではGraalVM EEが 無償で利用可能…!
  12. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | リリースサイクル • GraalVMのメジャーバージョンは3ヶ月ごと (2,5,8,11月の17日に最も近い火曜日)にリリース – Critical Patch Update(CPU)はOracleのCPUリリースのスケジュールに従う 12 - 2019/5 GraalVM 19.0 製品版ソフトウェアとしてリリース - 2019/8 GraalVM 19.2 最新メジャーバージョンリリース - 2019/11 に 19.3 リリース予定 - JDK 11に対応予定 https://www.graalvm.org/docs/release-notes/version-roadmap/
  13. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 目次 1. イントロダクション - GraalVMって何モノ? 2. 技術詳説 - GraalVMをもっと深く知ろう 3. 無限に広がるユースケース - GraalVMを使ってみよう 4. おまけ - GraalVMについてのよくある質問 13
  14. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 2. 技術詳説 - GraalVMをもっと深く知ろう! • 2-1. プログラミング言語ランタイムとしてのGraalVMを理解する • 2-2. Native Imageを理解する • 2-3. Embedded Runtimeを理解する 14
  15. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 2. 技術詳説 - GraalVMをもっと深く知ろう! • 2-1. プログラミング言語ランタイムとしてのGraalVMを理解する • 2-2. Native Imageを理解する • 2-3. Embedded Runtimeを理解する 15
  16. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 【予備知識】 JVMとは • JVM(Java Virtual Machine)はJavaプログラムを動かすためのソフトウェア – JVMがプラットフォームの差異を吸収することで、一度コードを書けばどのプラット フォームでもJavaアプリケーションを実行することが可能 • JVMが中間コードをプラットフォーム別に理解できるネイティブコードに変換 • メモリの確保・解放など、開発者を複雑な手作業から解放し、より開発に注力できるような 環境を提供 16 Javaの”Write once, Run anywhere”を実現する実行環境 Javaプログラム(中間コード) Windows Unix Linux Mac Windows版 JVM Unix版JVM Linux版JVM Mac版JVM Write once, Run anywhere! xxx.class
  17. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | • JVMは2つの方法を用いてクラス ファイルを実行 – インタプリタによるバイトコードの実行、 プロファイリング(メソッドの実行頻度や呼び出 し関係などの情報)の生成 • バイトコードを1命令ずつ解釈して実行 – JIT(Just In Time)コンパイラによりバイト コードを機械語に翻訳して実行 • C1コンパイラ:Client用 – コンパイル処理は速いが 理想的な最適化ではない • C2コンパイラ:Server用 – インタプリタが作成したプロファイリング情報を 用いて、翻訳を最適化する 17 【予備知識】 JVMのコンパイラの仕組み 解釈 生成 中間コード Profiling info Interpreter Machine code コンパイル 利用 生成 xxx.class JIT compiler C1 C2
  18. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | GraalVMの構造 • GraalVMはJITコンパイラ(C2)がGraalに置き換わる – GraalとはJavaで再実装されたJITコンパイラ • GraalをTruffle、Sulongと組み合わせることで多言語に対応 18 HotSpot HotSpot Compiler Interface JVMCI (JITコンパイラをJavaで実装するためのインターフェース) C1 (for Client) Graal C2 (for Server) Java VM (OpenJDK) GraalVM Javaアプリ Javaアプリ Truffle Sulong JS JIT コンパイラ Ruby R C C++ Javaランタイムとして見た場合のスタック
  19. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Graal / JVMCI • GraalはJVMのコンパイラインタフェース(JVMCI:Java-Level JVM Compiler Interface)を利用しJavaでコンパイラを書いたもの – JVMCIはJITコンパイラをJavaで実装するためのインターフェース – JVMのC2コンパイラは歴史もあり可能な限りの改善が施されたコンパイラだが C++で書かれており、コードの維持や拡張に限界がきている… – Javaでコンパイラを作り直すことによってより高いレベルの最適化が可能になった 19 https://www.infoq.com/jp/articles/Graal-Java-JIT-Compiler/ ✓ コンパイラの新規開発のハードルが非常に低くなる ✓ メモリ管理が安全になる ✓ 成熟したJavaのツール群を活用できる ✓ 新しいコンパイラ機能のプロトタイプをより早く作れる ✓ コンパイラがHotSpotから独立したものとなる ✓ コンパイラが自分自身をコンパイルでき、より速いJITコンパイルされたバージョンを生成できる
  20. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Truffle | 多言語対応のための仕組み 1 • 任意の言語インタプリタを実装するためのフレームワーク – プログラムのソースコードを解析してAST(抽象構文木)を 生成するためのAPIを提供 • Graal用にTruffleで実装されたインタプリタ – Ruby:truffleruby – Python:graalpython – R:fastr 20 https://github.com/oracle/graal/tree/master/truffle https://www.slideshare.net/jyukutyo/graalvmjvm HotSpot JVMCI (JITコンパイラをJavaで実装するためのインターフェース) Graal Javaアプリ Truffle Sulong JS Ruby R C C++ https://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-SO18-GraalVM-ja.pdf TruffleはJavaで書かれており、Graalコンパイラと一緒に使うことで、 自動的にJITコンパイルされインタプリタが最適化される
  21. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Sulong | 多言語対応のための仕組み 2 • 高性能なLLVMビットコードのインタープリタ – C / C++ / Rust / Swift などLLVMビットコードに変換できるプログラミング言語を GraalVM上で実行可能にする – Sulongは主にJavaで記述され、Truffleフレームワークと Graalコンパイラと一緒に使用 21 https://github.com/oracle/graal/tree/master/sulong HotSpot JVMCI (JITコンパイラをJavaで実装するためのインターフェース) Graal Javaアプリ Truffle Sulong JS Ruby R C C++ ※Wikipedia調べ
  22. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 対応言語 • 主要な対応言語 – Java:JDK8 – JavaScript:ECMAScript2019 – Ruby、R、Python、C、C++などはEarly Accesses 22 GraalVM Language Compatibilityを使用すると、NPMモジュール Ruby gem、RパッケージがGraalVMと互換性があるをすばやく Check可能です → https://www.graalvm.org/docs/reference-manual/compatibility
  23. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 単一ランタイム内の相互運用のメリット • 複数言語を共通のランタイムで動作させることで、全ての言語で共通の ツールやランタイムの機能を利用することができる – 例えばHotSpotのメモリ管理 • 大きなヒープの利用、実用的なGC実装 • 例えば、Node.jsをHopSpotの巨大なヒープ構成・管理上で実行し、 適切なGCの設定が利用できるように – 共通の開発ツールを利用することが可能 • デバッガ、プロファイラ • Graph Visualizer(Truffle / Graalが処理する中間言語からグラフ表現を生成) • VisualVM(ヒープやスレッドなどの実行時の状態を分析するツール) 23
  24. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | パフォーマンス 24 各言語のオリジナルのランタイムとGraalVMの 実行時間の比較 Normal JVMとGraalVM CEとGraalVM EEを比較 JUG Milano Meeting #82 - Polyglot on the JVM with Graal Graalはよりデータ処理(ストリーム/ラムダ式など)がある場合に高い性能がでる
  25. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 2. 技術詳説 - GraalVMをもっと深く知ろう! • 2-1. プログラミング言語ランタイムとしてのGraalVMを理解する • 2-2. Native Imageを理解する • 2-3. Embedded Runtimeを理解する 25
  26. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Native Image • GraalVMのNative Image生成機能 – JavaバイトコードをGraalによって事前コンパイル(AoT: Ahead of Time Compilation)し、ランタイムコン ポーネントとセットにしたNative Imageを生成する – スタンドアロンのexecutableとライブラリ、どちらも生成可能 • Native Imageのメリット – ランタイムの起動時間、及びプログラム実行初期のパフォーマンスの劇的な向上 – メモリフットプリントの極小化 – アプリケーションのランタイムを共有しないことによるセキュリティの向上 26 JavaバイトコードからシングルバイナリのNative Imageを生成 Warning !!! Native Imageは”Early Adopter”テクノロジーのため、GraalVM EEのサブスクリプション下でのサポートとなります。
  27. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Native Imageを生成する仕組みの概略 • コードの静的解析とGraalを用いたAoTによって、実行バイナリを生成 • 実行時プロファイルデータを利用した最適化も可能(オプション) 27 GraalをAoT(Ahead of Time) コンパイラとして使う ランタイムコンポーネント (Substrate VM) JDK Javaバイトコード(.jar/.class) • アプリケーション • 依存ライブラリ 実行バイナリ(Linux/MacOS) • AoT済みの • アプリケーション • ライブラリ • JDK • ランタイムコンポーネント (Substrate VM) 静的解析 ✓ Reachable Code ✓ Heap Analysis AoT 実行時プロファイル(オプション)
  28. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Substrate VM • JavaバイトコードのAOTコンパイルと周辺機能を実現するためのフレーム ワーク • Native Image生成時 – アプリケーションやJDKのバイトコードの静的解析などを行い、GraalによるAOTをサ ポートする • Native Image実行時 – Native Imageに内包され、アプリケーションのランタイムとして機能 – スレッド管理、メモリ管理、コードキャッシングなどの機能を提供 28 Native Imageの生成、実行を実現するための重要コンポーネント
  29. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | JIT vs. AOT • JITとAOTのトレードオフ – JITはコンパイルが進んでからの パフォーマンスに強み • 実行時プロファイルを十分に活用し てコンパイルするため、理想的な最 適化が可能 – AOTは起動後初期のパフォーマ ンスに強み • 起動直後からマシンコードで動作 • メモリや実行バイナリのフットプリント も少ない 29 用途に応じた使い分けが肝要 https://twitter.com/thomaswue/status/1145603781108928513
  30. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | • マイクロサービス – コンテナ化して実行するマ イクロサービスに、高速起 動、少フットプリントの特性 が好相性 • FaaS用ファンクション – ファンクションではJITコンパ イルを待てないケースが多 いので、AoTによる高速化 が特に有効 30 • コマンドラインツール – AoTによる高速化がファンク ション同様にパフォーマンス に有効 – ランタイムを別途用意する 必要がないシングルバイナ リとなるため、配布にも便利 Native Imageの用途の例 高速起動・少フットプリント・シングルバイナリがはまるユースケース f(x)
  31. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Native Imageのパフォーマンス • 高速起動・高速スケールが求められるユースケースに適する 31 マイクロサービスやFaaS用ファンクションとしての利用に適した特性 https://medium.com/graalvm/lightweight-cloud-native-java-applications-35d56bc45673
  32. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Native Imageの制約 • 非サポート機能 – 動的クラスローディング、ファイナライザ、…etc • 設定ファイルの用意が必要な機能 – リフレクション、リソース、動的プロキシ → 依存ライブラリ含めてこれらの制約をクリアしている必要がある 32 あらゆるJVMアプリが爆速に…!とはいかないので注意 Information Native Imageの制約の詳細を確認するには、Substrate VMのリポジトリを確認するのがベストです。 → https://github.com/oracle/graal/blob/master/substratevm/LIMITATIONS.md Substrate VMのリポジトリの.mdは一通り目を通すと、Native Imageの使い方がおおよそ把握できます。 → https://github.com/oracle/graal/blob/master/substratevm/
  33. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 2. 技術詳説 - GraalVMをもっと深く知ろう! • 2-1. プログラミング言語ランタイムとしてのGraalVMを理解する • 2-2. Native Imageを理解する • 2-3. Embedded Runtimeを理解する 33
  34. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | • 製品への組み込み – Oracle DBなどの製品に製品固有の言 語(SQLやPL/SQL)以外の言語を実行 可能にする – Oracle Multilingual Engine (Oracle MLE) ※実験的機能 • Oracle DBでJavaScriptのコードを内包するス トアド・ファンクションやPL/SQLを記述するこ とができる • https://oracle.github.io/oracle-db-mle/ • OpenJDKへの組み込み – OpenJDKにJVM言語以外の実行する 機能を持たせる • GraalVM Polyglot APIを使用し、 JVMベースのホストアプリケーションにゲスト 言語のコードを組み込み実行可能 34 Embedded Runtime public static void main(String[] args) { System.out.println("Hello World: Java!"); Context context = Context.create(); context.eval( "js", "print('Hello World: JavaScript!’);” ); } ↑ JavaScriptのコードブロック 例:Javaコード内でJavaScriptで記述 GraalVMを様々な環境に組み込んで多言語対応の拡張を行う
  35. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Oracle Database Multilingual Engine (MLE) • Oracle Database内のJavaScript, Python実行エンジンとしてGraalVMを利用。 DBにあらかじめ登録したJavaScript, PythonコードをDB内のエンジンで実行 – GraalVM公式ドキュメント上のサンプル: https://www.graalvm.org/docs/examples/mle-oracle/ – MLEの公式ドキュメント: https://oracle.github.io/oracle-db-mle/ 35 Oracle DatabaseのSQLから異種言語のコードを利用 SQL> select validator.isEmail('oleg.selaev@oracle.com') from dual; SQL> select validator.isEmail('oleg.selaev') from dual; npmのvalidatorモジュールを使って、文字列のバリデーションを実行している例
  36. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Oracle Database MLEの仕組み • 専用ツール(dbcs/dbpy)でJS/PythonのパッケージをDBに登録すると、 PL/SQL内でJS/Pythonで記述したり、SQL文内のUDFとして利用可能になる 36 任意のJS/Pythonパッケージを事前登録して、Oracle DB上で利用可能にする PL/SQL Oracle Database JS JS Bundle PL/SQL Code JavaScript + TypeScript > dbjs MLE UMD Module PL/SQL内のJS/Pythonコードや UDFとして実行 ※UDF: User Defined Function
  37. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | OpenJDKへの組み込み • GraalVMプロジェクトが提供するPolyglot APIを利用することで、JVM言語の ホストアプリケーションでゲスト言語のコードを組み込み実行可能 – org.graalvm.polyglot / org.graalvm.polyglot.proxy / org.graalvm.polyglot.io • 単純なゲスト言語の実行の他、様々な相互運用の機能を提供 – e.g.) • JavaScriptの関数の実行結果をJava変数に格納 • JavaScript内の変数をJavaから取得、変更 • JavaScriptからJavaのオブジェクトにアクセス • JavaScript内でJavaオブジェクトのを利用 …etc 37 JVM言語の多言語拡張をGraalVMとPolyglot APIで実現 ※ これらの例では、ホスト言語: Java 、ゲスト言語: JavaScript)
  38. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 38 OpenJDKへの組み込みのコード例 try (Context context = Context.create()) { Value function = context.eval("js", "x => x+1"); assert function.canExecute(); int x = function.execute(41).asInt(); assert x == 42; } static void main(String[] args) { try (Context context = Context.newBuilder().allowAllAccess(true).build()) { context.getBindings("js") .putMember("javaObj", new MyClass()); boolean valid = context.eval("js", " javaObj.id == 42" + " && javaObj.text == '42'" + " && javaObj.arr[1] == 42" + " && javaObj.ret42() == 42") .asBoolean(); assert valid == true; } } • ゲスト言語の実行結果をJava 変数に格納 • ゲスト言語から、Javaで定義されたオブ ジェクトにアクセス
  39. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 目次 1. イントロダクション - GraalVMって何モノ? 2. 技術詳説 - GraalVMをもっと深く知ろう 3. 無限に広がるユースケース - GraalVMを使ってみよう 4. おまけ - GraalVMについてのよくある質問 39
  40. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | GraalVMのユースケース例 • Top 10 Things To Do With GraalVM – https://medium.com/graalvm/graalvm-ten-things-12d9111f307d 40 GraalVMは非常に多様なユースケースが想定されている • 1. High-performance modern Java* • 2. Low-footprint, fast-startup Java* • 3. Combine JavaScript, Java, Ruby, and R* • 4. Run native languages on the JVM • 5. Tools that work across all languages • 6. Extend a JVM-based application • 7. Extend a native application • 8. Java code as a native library • 9. Polyglot in the database • 10. Create your own language * があるものはデモもやります
  41. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 1. High-performance modern Java* • JVMアプリケーションをGraalVMに載せ替えてパフォーマンス向上を図る • Graalを利用する最もシンプルなユースケース 41 JVMアプリのランタイムとして利用 Demo: 1. Linux環境の準備とGraalVMのインストール 2. 簡単なJavaコードの実行 3. Graalを使った場合とそうでない場合のパフォーマンスの比較 参考リンク: GraalVM Community Editionのダウンロード: https://github.com/oracle/graal/releases デモシナリオ: https://www.graalvm.org/docs/examples/java-performance-examples/
  42. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 2. Low-footprint, fast-startup Java* • Native Image / AOTを利用して、高速起動、少メモリフットプリントが活きる ユースケースに適用 – e.g.) マイクロサービス、FaaS用ファンクション、コマンドラインツール 42 Native Image / AOTの特性を利用したユースケース Demo: 1. Native Imageをビルドするための準備 2. 簡単なコマンドラインツールのビルドとNative Image化 3. Native Image化する前後でのパフォーマンスの比較 参考リンク: デモ用コマンドラインツールのコード: https://github.com/hhiroshell/cowsay/
  43. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | • Helidon – 開発主体: オラクル – MicroProfile 3.0フル実装で 標準重視のHelidon MPと、 リアクティブなコーディング スタイルと軽量性を特徴と するHelidon SEがある (Native Image化を想定して いるのは後者) – Cloud Nativeな運用ツール (監視、ヘルスチェック、ト レーシング等)に対応 • Micronaut – 開発主体:Grailsチーム – Java/Groovy/Kotlinが使用 可能 – コンパイル時インジェクショ ンや、宣言的なREST Client が特徴的 – Cloud Nativeな運用ツール に加え、Consul、AWS、GCP での実行を想定した機能を 提供 43 • Quarkus – 開発主体:レッドハット – 従来型の命令的実装とリア クティブの両立を志向した コーディングスタイル – CDIを部分的な実装とするこ とでNative Imageに対応 – Cloud Nativeな運用ツール に加え、Hibernate、Kafkaク ライアント等OSSのライブラリ をとりこんだフルスタックフ レームワークを志向 Helidon / Micronaut / Quarkus Native Image化を想定したマイクロサービス実装用フレームワークたち
  44. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | picocli • コマンドラインツールをJavaで実装するためのフレームワーク – サブコマンド、ANSIカラー、TAB補完など、CLIの様々な機能に対応 – https://github.com/remkop/picocli • Native Image対応 – Native Imageで必要な設定ファイル(リフレクション、リソース、動的プロキシ)を生成 するためのツールを提供 44 Native Image化を想定したコマンドラインツール用フレームワーク – https://picocli.info/
  45. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 3. Combine JavaScript, Java, Ruby, and R* • 言語固有のライブラリを他言語から利用するなど – e.g. Rの統計処理系ライブラリをNode.jsのアプリで使いたい 45 同一アプリケーション内で複数の言語を利用するユースケース Demo: 1. GraalVMでRを利用するための準備 2. JavaScriptからJava、Rを呼び出すアプリケーションの実行 参考リンク: デモアプリケーション: https://github.com/graalvm/graalvm-demos/tree/master/polyglot-javascript-java-r デモシナリオ: https://www.graalvm.org/docs/examples/polyglot-javascript-java-r/
  46. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 46 JavaScriptアプリケーションからのRコードの実行例 (…snip…) app.get('/', function (req, res) { (…snip…) // Using R interoperability to create graphs text += Polyglot.eval('R', `svg(); require(lattice); x <- 1:100 y <- sin(x/10) z <- cos(x^1.3/(runif(1)*5+10)) print(cloud(x~y*z, main="cloud plot")) grDevices:::svg.off() `); res.send(text) }) (…snip…) Node.jsのアプリケーション内で、 Rのライブラリを使って3次元グラフの描画を行っている
  47. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 4. Run native languages on the JVM • Sulongを利用することで、LLVM bitcodeをGraalVM上で実行可能 – C以外に、原理的にはC++、Fortranなどが実行可能になる 47 Sulongを利用してGraalVM上でネイティブ言語を実行 参考リンク: Sulongのリポジトリ: https://github.com/oracle/graal/tree/master/sulong
  48. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 5. Tools that work across all languages • Graal / JVMCI / HotSpot以下は各言語共通のため、同じ開発ツールを利 用することが可能 – デバッガ、プロファイラ – Graph Visualizer(Truffle / Graalが処理する中間言語からグラフ表現を生成) – VisualVM(ヒープやスレッドなどの実行時の状態を分析するツール) • これらのツールが充実していない言語にとっては、GraalVMに対応すると 自動的にこれらが利用可能になる 48 GraalVMで実行する限り、共通の開発ツールを利用可能 参考リンク: リファレンス: https://www.graalvm.org/docs/reference-manual/tools/
  49. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 多言語共通デバッガ • Chrome DevTools Protocol 対応のデバッガを提供 • どの言語でも、Chromeの 開発者ツールでデバッグ が可能 49 https://www.graalvm.org/docs/reference-manual/tools/
  50. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 6. Extend a JVM-based application – GraalVMプロジェクトが提供するPolyglot APIを使うことで、JVM言語のコードに他言 語を埋め込んで実行可能 50 7. Extend a native application – GraalVMプロジェクトが提供する専用ライブラリ経由して、ネイティブアプリケーション から同一コンテキスト内で他言語で書かれたコードを実行可能 8. Java code as a native library – ネイティブ言語のためのライブラリをJava等で実装し、Native Image化して利用 – 豊富なJavaのライブラリをネイティブ言語で利用可能に
  51. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 9. Polyglot in the database • Language Embeddingのユースケース – e.g.) Oracle DatabaseのSQL内でJavaScriptのライブラリを実行 – フロントやアプリと同一のコードで、DB上でバリデーションを実行したいときなど 51 Databaseに多言語拡張を組み込んでSQL内でJSを利用するなど Demo: 1. Oracle Database MLEの環境を準備 2. JavaScriptライブラリをMLE環境に登録 3. SQLからJavaScriptライブラリを実行 参考リンク: Oracle Database MLEドキュメント: https://oracle.github.io/oracle-db-mle/ デモシナリオ: https://www.graalvm.org/docs/examples/mle-oracle/
  52. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 10. Create your own language • 独自のプログラミング言語を実装する – TruffleはインタプリタをJavaで実装するためのライブラリであり、これを利用 – 特定ドメインに特化した新言語を作ったり、既存の言語の高性能な実装を作るなど 52 独自言語を実装することすら可能… 参考リンク: ドキュメント: https://www.graalvm.org/docs/graalvm-as-a-platform/implement-language/ 独自言語のサンプル: https://github.com/graalvm/simplelanguage
  53. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 目次 1. イントロダクション - GraalVMって何モノ? 2. 技術詳説 - GraalVMをもっと深く知ろう 3. 無限に広がるユースケース - GraalVMを使ってみよう 4. おまけ - GraalVMについてのよくある質問 53
  54. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 54 Q1 Q GraalVMの導入事例について教えて下さい A 現在GraalVMがプロダクションで稼働している事例がいくつかありま す。 例えば、TwitterのChristian Thalinger氏は、同社でのGraalVMのプロ ダクション利用について、パフォーマンスの改善とコスト削減効果を 交えて語ってくれています[^1]。 [^1]: https://www.oracle.com/tools/graalvm-enterprise-edition.html?bcid=5772128098001
  55. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 55 Q2 Q Java11対応はいつ頃になる予定でしょうか? A 現在、GraalVMはJava11をサポートしていません。 GraalVMプロジェクトはJava11のサポートを完了するために積極的 に取り組んでいます。これは、Java8の継続的な開発と並行して行わ れています。 2019/09/19 追記: Oracle Open World 2019にて、19.3(2019年11月リリース予定)で対応予定との発表がありました
  56. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 56 Q3 Q SpringのアプリをNative Image化できますか? A Spring FrameworkのNative Image対応は開発の初期段階にあり、現在はサ ポートされていません。 GraalVMチームはSpringアプリケーションのネイティブイメージへのコンパイルを 完全にサポートするために何ができるかを調査しています。 Springプロジェクト側の取り組みについての参考情報として以下も参照ください。 • https://github.com/spring-projects/spring-framework/issues/22968 • https://github.com/spring-projects-experimental/spring-graal-feature
  57. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | その他 公式ドキュメントのFAQも御覧ください • https://www.graalvm.org/docs/faq/ 57
  58. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 58 Fin.
  59. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Safe Harbor Statement The preceding is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, timing, and pricing of any features or functionality described for Oracle’s products may change and remains at the sole discretion of Oracle Corporation. 59
  60. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 60
  61. None