$30 off During Our Annual Pro Sale. View Details »

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

hhiroshell
September 19, 2019

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

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

GraalVMの入門者向けの解説。

hhiroshell

September 19, 2019
Tweet

More Decks by hhiroshell

Other Decks in Technology

Transcript

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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通りがある

    View Slide

  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仮想マシンのようなプログラミング言語ランタイムとしての利用方法

    View Slide

  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アプリ(マシン語)
    + ランタイム
    シングルバイナリ

    View Slide

  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で記述

    View Slide

  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が
    無償で利用可能…!

    View Slide

  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/

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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ランタイムとして見た場合のスタック

    View Slide

  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コンパイルされたバージョンを生成できる

    View Slide

  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コンパイルされインタプリタが最適化される

    View Slide

  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調べ

    View Slide

  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

    View Slide

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

    View Slide

  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はよりデータ処理(ストリーム/ラムダ式など)がある場合に高い性能がでる

    View Slide

  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

    View Slide

  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のサブスクリプション下でのサポートとなります。

    View Slide

  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
    実行時プロファイル(オプション)

    View Slide

  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の生成、実行を実現するための重要コンポーネント

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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/

    View Slide

  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

    View Slide

  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を様々な環境に組み込んで多言語対応の拡張を行う

    View Slide

  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('[email protected]') from dual;
    SQL> select validator.isEmail('oleg.selaev') from dual;
    npmのvalidatorモジュールを使って、文字列のバリデーションを実行している例

    View Slide

  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

    View Slide

  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)

    View Slide

  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で定義されたオブ
    ジェクトにアクセス

    View Slide

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

    View Slide

  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
    * があるものはデモもやります

    View Slide

  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/

    View Slide

  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/

    View Slide

  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化を想定したマイクロサービス実装用フレームワークたち

    View Slide

  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/

    View Slide

  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/

    View Slide

  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次元グラフの描画を行っている

    View Slide

  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

    View Slide

  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/

    View Slide

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

    View Slide

  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のライブラリをネイティブ言語で利用可能に

    View Slide

  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/

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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月リリース予定)で対応予定との発表がありました

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  61. View Slide