Oracle Cloud Hangout Cafe(OCHaCafe) Season 2 #2 での発表資料です。 https://ochacafe.connpass.com/event/140792/
GraalVMの入門者向けの解説。
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |一体何モノなの? GraalVM入門編茂 こと | @cotoc88 / 早川 博 | @hhiroshell日本オラクル株式会社クラウド事業戦略統括 ソリューション・エンジニアOracle Cloud Hangout Cafe - Season2 #2
View Slide
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |Safe Harbor StatementThe following is intended to outline our general product direction. It is intended forinformation purposes only, and may not be incorporated into any contract. It is not acommitment to deliver any material, code, or functionality, and should not be relied uponin making purchasing decisions. The development, release, timing, and pricing of anyfeatures or functionality described for Oracle’s products may change and remains at thesole discretion of Oracle Corporation.2
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |目次1. イントロダクション - GraalVMって何モノ?2. 技術詳説 - GraalVMをもっと深く知ろう3. 無限に広がるユースケース - GraalVMを使ってみよう4. おまけ - GraalVMについてのよくある質問3
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |目次1. イントロダクション - GraalVMって何モノ?2. 技術詳説 - GraalVMをもっと深く知ろう3. 無限に広がるユースケース - GraalVMを使ってみよう4. おまけ - GraalVMについてのよくある質問4
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
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |GraalVMでできることの例• 単一のランタイムで複数種のプログラミング言語を動かせる• サイズの小さい(数十MB~)JVMアプリコンテナを作ることができる• SQL文でJavaScriptのライブラリを使った処理を記述する6
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |GraalVMの3つの側面• 単一のランタイムで複数種のプログラミング言語を動かせる→ 1. プログラミング言語ランタイム• サイズの小さい(数十MB~)JVMアプリコンテナを作ることができる→ 2. シングルバイナリ(Native Image)生成装置• SQL文でJavaScriptのライブラリを使った処理を記述する→ 3. 組み込みランタイム7GraalVMの利用形態には大きく3通りがある
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から実行するなど83. ハイパフォーマンス– 新しいJITコンパイル技術によりアプリケーションの実行を高速化1. プログラミング言語ランタイムとしてのGraalVMJava仮想マシンのようなプログラミング言語ランタイムとしての利用方法
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |2. Native Image生成装置としてのGraalVMJavaバイトコードをコンパイルしシングルバイナリ(=Native Image)化する機能• アプリケーションを事前にマシン語にコンパイル(AOT: Ahead of Time Compilation)し、ランタイムと合わせたシングルバイナリを生成する– ランタイムの起動時間、及びプログラム実行初期のパフォーマンスの劇的な向上– メモリフットプリントの極小化– アプリケーションのランタイムを共有しないことによるセキュリティの向上9HotSpotCompiler InterfaceC2 (for Server)Javaアプリnative-imageJavaアプリ(マシン語)+ ランタイムシングルバイナリ
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ベースのホストアプリケーションにゲスト言語のコードを組み込み実行可能103. 多言語実行を様々な環境に組み込むGraalVMGraalVMを様々な環境に組み込んで多言語対応の拡張を行う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で記述
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が無償で利用可能…!
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/
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |目次1. イントロダクション - GraalVMって何モノ?2. 技術詳説 - GraalVMをもっと深く知ろう3. 無限に広がるユースケース - GraalVMを使ってみよう4. おまけ - GraalVMについてのよくある質問13
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |2. 技術詳説 - GraalVMをもっと深く知ろう!• 2-1. プログラミング言語ランタイムとしてのGraalVMを理解する• 2-2. Native Imageを理解する• 2-3. Embedded Runtimeを理解する14
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |2. 技術詳説 - GraalVMをもっと深く知ろう!• 2-1. プログラミング言語ランタイムとしてのGraalVMを理解する• 2-2. Native Imageを理解する• 2-3. Embedded Runtimeを理解する15
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |【予備知識】 JVMとは• JVM(Java Virtual Machine)はJavaプログラムを動かすためのソフトウェア– JVMがプラットフォームの差異を吸収することで、一度コードを書けばどのプラットフォームでもJavaアプリケーションを実行することが可能• JVMが中間コードをプラットフォーム別に理解できるネイティブコードに変換• メモリの確保・解放など、開発者を複雑な手作業から解放し、より開発に注力できるような環境を提供16Javaの”Write once, Run anywhere”を実現する実行環境Javaプログラム(中間コード)Windows Unix Linux MacWindows版JVMUnix版JVM Linux版JVM Mac版JVMWrite once, Run anywhere!xxx.class
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |• JVMは2つの方法を用いてクラスファイルを実行– インタプリタによるバイトコードの実行、プロファイリング(メソッドの実行頻度や呼び出し関係などの情報)の生成• バイトコードを1命令ずつ解釈して実行– JIT(Just In Time)コンパイラによりバイトコードを機械語に翻訳して実行• C1コンパイラ:Client用– コンパイル処理は速いが理想的な最適化ではない• C2コンパイラ:Server用– インタプリタが作成したプロファイリング情報を用いて、翻訳を最適化する17【予備知識】 JVMのコンパイラの仕組み解釈生成中間コードProfiling infoInterpreterMachinecodeコンパイル利用生成xxx.classJIT compilerC1 C2
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |GraalVMの構造• GraalVMはJITコンパイラ(C2)がGraalに置き換わる– GraalとはJavaで再実装されたJITコンパイラ• GraalをTruffle、Sulongと組み合わせることで多言語に対応18HotSpot HotSpotCompiler Interface JVMCI (JITコンパイラをJavaで実装するためのインターフェース)C1 (for Client) GraalC2 (for Server)Java VM (OpenJDK) GraalVMJavaアプリ Javaアプリ TruffleSulongJSJITコンパイラRuby RC C++Javaランタイムとして見た場合のスタック
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |Graal / JVMCI• GraalはJVMのコンパイラインタフェース(JVMCI:Java-Level JVM CompilerInterface)を利用しJavaでコンパイラを書いたもの– JVMCIはJITコンパイラをJavaで実装するためのインターフェース– JVMのC2コンパイラは歴史もあり可能な限りの改善が施されたコンパイラだがC++で書かれており、コードの維持や拡張に限界がきている…– Javaでコンパイラを作り直すことによってより高いレベルの最適化が可能になった19https://www.infoq.com/jp/articles/Graal-Java-JIT-Compiler/✓ コンパイラの新規開発のハードルが非常に低くなる✓ メモリ管理が安全になる✓ 成熟したJavaのツール群を活用できる✓ 新しいコンパイラ機能のプロトタイプをより早く作れる✓ コンパイラがHotSpotから独立したものとなる✓ コンパイラが自分自身をコンパイルでき、より速いJITコンパイルされたバージョンを生成できる
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |Truffle | 多言語対応のための仕組み 1• 任意の言語インタプリタを実装するためのフレームワーク– プログラムのソースコードを解析してAST(抽象構文木)を生成するためのAPIを提供• Graal用にTruffleで実装されたインタプリタ– Ruby:truffleruby– Python:graalpython– R:fastr20https://github.com/oracle/graal/tree/master/trufflehttps://www.slideshare.net/jyukutyo/graalvmjvmHotSpotJVMCI (JITコンパイラをJavaで実装するためのインターフェース)GraalJavaアプリ TruffleSulongJS Ruby RC C++https://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-SO18-GraalVM-ja.pdfTruffleはJavaで書かれており、Graalコンパイラと一緒に使うことで、自動的にJITコンパイルされインタプリタが最適化される
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |Sulong | 多言語対応のための仕組み 2• 高性能なLLVMビットコードのインタープリタ– C / C++ / Rust / Swift などLLVMビットコードに変換できるプログラミング言語をGraalVM上で実行可能にする– Sulongは主にJavaで記述され、TruffleフレームワークとGraalコンパイラと一緒に使用21https://github.com/oracle/graal/tree/master/sulongHotSpotJVMCI (JITコンパイラをJavaで実装するためのインターフェース)GraalJavaアプリ TruffleSulongJS Ruby RC C++※Wikipedia調べ
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |対応言語• 主要な対応言語– Java:JDK8– JavaScript:ECMAScript2019– Ruby、R、Python、C、C++などはEarly Accesses22GraalVM Language Compatibilityを使用すると、NPMモジュールRuby gem、RパッケージがGraalVMと互換性があるをすばやくCheck可能です→ https://www.graalvm.org/docs/reference-manual/compatibility
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |単一ランタイム内の相互運用のメリット• 複数言語を共通のランタイムで動作させることで、全ての言語で共通のツールやランタイムの機能を利用することができる– 例えばHotSpotのメモリ管理• 大きなヒープの利用、実用的なGC実装• 例えば、Node.jsをHopSpotの巨大なヒープ構成・管理上で実行し、適切なGCの設定が利用できるように– 共通の開発ツールを利用することが可能• デバッガ、プロファイラ• Graph Visualizer(Truffle / Graalが処理する中間言語からグラフ表現を生成)• VisualVM(ヒープやスレッドなどの実行時の状態を分析するツール)23
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はよりデータ処理(ストリーム/ラムダ式など)がある場合に高い性能がでる
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |2. 技術詳説 - GraalVMをもっと深く知ろう!• 2-1. プログラミング言語ランタイムとしてのGraalVMを理解する• 2-2. Native Imageを理解する• 2-3. Embedded Runtimeを理解する25
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のメリット– ランタイムの起動時間、及びプログラム実行初期のパフォーマンスの劇的な向上– メモリフットプリントの極小化– アプリケーションのランタイムを共有しないことによるセキュリティの向上26JavaバイトコードからシングルバイナリのNative Imageを生成Warning !!!Native Imageは”Early Adopter”テクノロジーのため、GraalVM EEのサブスクリプション下でのサポートとなります。
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |Native Imageを生成する仕組みの概略• コードの静的解析とGraalを用いたAoTによって、実行バイナリを生成• 実行時プロファイルデータを利用した最適化も可能(オプション)27GraalをAoT(Ahead of Time) コンパイラとして使うランタイムコンポーネント(Substrate VM)JDKJavaバイトコード(.jar/.class)• アプリケーション• 依存ライブラリ実行バイナリ(Linux/MacOS)• AoT済みの• アプリケーション• ライブラリ• JDK• ランタイムコンポーネント(Substrate VM)静的解析✓ Reachable Code✓ Heap AnalysisAoT実行時プロファイル(オプション)
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |Substrate VM• JavaバイトコードのAOTコンパイルと周辺機能を実現するためのフレームワーク• Native Image生成時– アプリケーションやJDKのバイトコードの静的解析などを行い、GraalによるAOTをサポートする• Native Image実行時– Native Imageに内包され、アプリケーションのランタイムとして機能– スレッド管理、メモリ管理、コードキャッシングなどの機能を提供28Native Imageの生成、実行を実現するための重要コンポーネント
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |JIT vs. AOT• JITとAOTのトレードオフ– JITはコンパイルが進んでからのパフォーマンスに強み• 実行時プロファイルを十分に活用してコンパイルするため、理想的な最適化が可能– AOTは起動後初期のパフォーマンスに強み• 起動直後からマシンコードで動作• メモリや実行バイナリのフットプリントも少ない29用途に応じた使い分けが肝要https://twitter.com/thomaswue/status/1145603781108928513
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |• マイクロサービス– コンテナ化して実行するマイクロサービスに、高速起動、少フットプリントの特性が好相性• FaaS用ファンクション– ファンクションではJITコンパイルを待てないケースが多いので、AoTによる高速化が特に有効30• コマンドラインツール– AoTによる高速化がファンクション同様にパフォーマンスに有効– ランタイムを別途用意する必要がないシングルバイナリとなるため、配布にも便利Native Imageの用途の例高速起動・少フットプリント・シングルバイナリがはまるユースケースf(x)
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |Native Imageのパフォーマンス• 高速起動・高速スケールが求められるユースケースに適する31マイクロサービスやFaaS用ファンクションとしての利用に適した特性https://medium.com/graalvm/lightweight-cloud-native-java-applications-35d56bc45673
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |Native Imageの制約• 非サポート機能– 動的クラスローディング、ファイナライザ、…etc• 設定ファイルの用意が必要な機能– リフレクション、リソース、動的プロキシ→ 依存ライブラリ含めてこれらの制約をクリアしている必要がある32あらゆるJVMアプリが爆速に…!とはいかないので注意InformationNative Imageの制約の詳細を確認するには、Substrate VMのリポジトリを確認するのがベストです。→ https://github.com/oracle/graal/blob/master/substratevm/LIMITATIONS.mdSubstrate VMのリポジトリの.mdは一通り目を通すと、Native Imageの使い方がおおよそ把握できます。→ https://github.com/oracle/graal/blob/master/substratevm/
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |2. 技術詳説 - GraalVMをもっと深く知ろう!• 2-1. プログラミング言語ランタイムとしてのGraalVMを理解する• 2-2. Native Imageを理解する• 2-3. Embedded Runtimeを理解する33
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ベースのホストアプリケーションにゲスト言語のコードを組み込み実行可能34Embedded Runtimepublic 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を様々な環境に組み込んで多言語対応の拡張を行う
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/35Oracle DatabaseのSQLから異種言語のコードを利用SQL> select validator.isEmail('[email protected]') from dual;SQL> select validator.isEmail('oleg.selaev') from dual;npmのvalidatorモジュールを使って、文字列のバリデーションを実行している例
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/SQLOracle DatabaseJSJSBundlePL/SQLCodeJavaScript +TypeScript> dbjsMLEUMD ModulePL/SQL内のJS/PythonコードやUDFとして実行※UDF: User Defined Function
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オブジェクトのを利用…etc37JVM言語の多言語拡張をGraalVMとPolyglot APIで実現※ これらの例では、ホスト言語: Java 、ゲスト言語: JavaScript)
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 38OpenJDKへの組み込みのコード例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で定義されたオブジェクトにアクセス
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |目次1. イントロダクション - GraalVMって何モノ?2. 技術詳説 - GraalVMをもっと深く知ろう3. 無限に広がるユースケース - GraalVMを使ってみよう4. おまけ - GraalVMについてのよくある質問39
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-12d9111f307d40GraalVMは非常に多様なユースケースが想定されている• 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* があるものはデモもやります
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |1. High-performance modern Java*• JVMアプリケーションをGraalVMに載せ替えてパフォーマンス向上を図る• Graalを利用する最もシンプルなユースケース41JVMアプリのランタイムとして利用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/
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |2. Low-footprint, fast-startup Java*• Native Image / AOTを利用して、高速起動、少メモリフットプリントが活きるユースケースに適用– e.g.) マイクロサービス、FaaS用ファンクション、コマンドラインツール42Native Image / AOTの特性を利用したユースケースDemo:1. Native Imageをビルドするための準備2. 簡単なコマンドラインツールのビルドとNative Image化3. Native Image化する前後でのパフォーマンスの比較参考リンク:デモ用コマンドラインツールのコード: https://github.com/hhiroshell/cowsay/
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 / QuarkusNative Image化を想定したマイクロサービス実装用フレームワークたち
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |picocli• コマンドラインツールをJavaで実装するためのフレームワーク– サブコマンド、ANSIカラー、TAB補完など、CLIの様々な機能に対応– https://github.com/remkop/picocli• Native Image対応– Native Imageで必要な設定ファイル(リフレクション、リソース、動的プロキシ)を生成するためのツールを提供44Native Image化を想定したコマンドラインツール用フレームワーク– https://picocli.info/
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/
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 46JavaScriptアプリケーションからのRコードの実行例(…snip…)app.get('/', function (req, res) {(…snip…)// Using R interoperability to create graphstext += Polyglot.eval('R',`svg();require(lattice);x <- 1:100y <- 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次元グラフの描画を行っている
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |4. Run native languages on the JVM• Sulongを利用することで、LLVM bitcodeをGraalVM上で実行可能– C以外に、原理的にはC++、Fortranなどが実行可能になる47Sulongを利用してGraalVM上でネイティブ言語を実行参考リンク:Sulongのリポジトリ: https://github.com/oracle/graal/tree/master/sulong
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に対応すると自動的にこれらが利用可能になる48GraalVMで実行する限り、共通の開発ツールを利用可能参考リンク:リファレンス: https://www.graalvm.org/docs/reference-manual/tools/
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |多言語共通デバッガ• Chrome DevTools Protocol対応のデバッガを提供• どの言語でも、Chromeの開発者ツールでデバッグが可能49https://www.graalvm.org/docs/reference-manual/tools/
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |6. Extend a JVM-based application– GraalVMプロジェクトが提供するPolyglot APIを使うことで、JVM言語のコードに他言語を埋め込んで実行可能507. Extend a native application– GraalVMプロジェクトが提供する専用ライブラリ経由して、ネイティブアプリケーションから同一コンテキスト内で他言語で書かれたコードを実行可能8. Java code as a native library– ネイティブ言語のためのライブラリをJava等で実装し、Native Image化して利用– 豊富なJavaのライブラリをネイティブ言語で利用可能に
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |9. Polyglot in the database• Language Embeddingのユースケース– e.g.) Oracle DatabaseのSQL内でJavaScriptのライブラリを実行– フロントやアプリと同一のコードで、DB上でバリデーションを実行したいときなど51Databaseに多言語拡張を組み込んで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/
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
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |目次1. イントロダクション - GraalVMって何モノ?2. 技術詳説 - GraalVMをもっと深く知ろう3. 無限に広がるユースケース - GraalVMを使ってみよう4. おまけ - GraalVMについてのよくある質問53
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 54Q1Q GraalVMの導入事例について教えて下さいA現在GraalVMがプロダクションで稼働している事例がいくつかあります。例えば、TwitterのChristian Thalinger氏は、同社でのGraalVMのプロダクション利用について、パフォーマンスの改善とコスト削減効果を交えて語ってくれています[^1]。[^1]:https://www.oracle.com/tools/graalvm-enterprise-edition.html?bcid=5772128098001
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 55Q2Q Java11対応はいつ頃になる予定でしょうか?A現在、GraalVMはJava11をサポートしていません。GraalVMプロジェクトはJava11のサポートを完了するために積極的に取り組んでいます。これは、Java8の継続的な開発と並行して行われています。2019/09/19 追記:Oracle Open World 2019にて、19.3(2019年11月リリース予定)で対応予定との発表がありました
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 56Q3Q SpringのアプリをNative Image化できますか?ASpring FrameworkのNative Image対応は開発の初期段階にあり、現在はサポートされていません。GraalVMチームはSpringアプリケーションのネイティブイメージへのコンパイルを完全にサポートするために何ができるかを調査しています。Springプロジェクト側の取り組みについての参考情報として以下も参照ください。• https://github.com/spring-projects/spring-framework/issues/22968• https://github.com/spring-projects-experimental/spring-graal-feature
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |その他 公式ドキュメントのFAQも御覧ください• https://www.graalvm.org/docs/faq/57
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 58Fin.
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |Safe Harbor StatementThe preceding is intended to outline our general product direction. It is intended forinformation purposes only, and may not be incorporated into any contract. It is not acommitment to deliver any material, code, or functionality, and should not be relied uponin making purchasing decisions. The development, release, timing, and pricing of anyfeatures or functionality described for Oracle’s products may change and remains at thesole discretion of Oracle Corporation.59
Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 60