SlideShare a Scribd company logo
阪田 浩一
Koichi Sakata
GraalVMで使われている、
他言語をJVM上に実装する
仕組みを学ぼう
About Me
• 阪田 浩一 @jyukutyo
• 関西Javaエンジニアの会 会長
• Javaチャンピオン
• ポノス株式会社(京都)
• JVMになりたい人
http://www.graalvm.org/
http://www.graalvm.org/
WIP for
Windows
GraalVM = HotSpotVM + α
Custom Part in GraalVM
• Graal
– JIT Compiler
• Truffle
– Language Implementation Framework
• SubstrateVM
– Runtime Library andTools
for Java AOT Compiled Code
HotSpotVM
Compiler Interface
C2C1
HotSpotVM
C++
GraalVM
Compiler
Interface
GraalC1
HotSpotVM
JVMCI
Java
GraalVM ≠ Graal
Top 10ThingsTo DoWith 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
http://www.graalvm.org/
Top 10ThingsTo DoWith 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
Polyglot
HotSpotVM
JVMCI
Graal
JVM lang Truffle
LLVMJS R Ruby
C C++
Fortran
Polyglot
HotSpotVM
JVMCI
Graal
JVM lang Truffle
LLVMJS R Ruby
C C++
Fortran
Interpreter
Truffleでの言語実装
• TruffleRuby (Ruby)
– https://github.com/graalvm/truffleruby
• FastR (GNU R)
– https://github.com/graalvm/fastr
• Graal.js (JavaScript)
– ECMAScript 2018/Node.js 10.15.0
– https://github.com/graalvm/graaljs
• SimpleLanguage (学習用)
– https://github.com/graalvm/simplelanguage
ということは…!
オレオレ言語もJVM上で!
HotSpotVM
JVMCI
Graal
JVM lang Truffle
オレオレ言語
なんでそんなことするの?
Because it's fun!
今日のゴール
私もTruffleを使って、
言語を実装してみようかな、
と思ってもらうこと
Truffle
• Language Implementation Framework
– A library for building
programming language implementations as
interpreters for AST
AST
Abstract SyntaxTree
抽象構文木
サンプルとして
四則演算を考える
AST
*
3
1 2
+(1 + 2) * 3
プログラムを
ASTに変換する
とは
プログラムの解析
(1 + 2) * 3
( 1 + 2 ) * 3
レキサー
パーサー
サンプル
(1 + 2) * 3
( 1 + 2 ) * 3
テキスト
トークン
構文木
ASTへ
*
3
1 2
+
ASTを
インタープリトして
コードを実行する
Truffleのメリット
ASTにさえできれば、
GraalとJVMに
実行を任せられる
Truffleでのメリット
ランタイム構築を
自分でやらなくてよい
たとえば
JITコンパイル
(Partial Evaluation/部分評価)
モジュール 入力 出力
レキサー
(字句解析)
テキスト
(コード)
トークン
パーサー
(構文解析)
トークン 構文木
AST
インタプリタ
構文木から作成した
AST
実行結果
プログラムを実行するまで
モジュール 入力 出力
レキサー
(字句解析)
テキスト
(コード)
トークン
パーサー
(構文解析)
トークン 構文木
AST
インタプリタ
構文木から作成した
AST
実行結果
プログラムを実行するまで今日の範囲外
レキサー/パーサー
• ANTLR http://www.antlr.org/
モジュール ライブラリ
レキサー ANTLR
パーサー ANTLR
ASTインタプリタ Truffle
ライブラリの役割
今日の内容
オレオレ言語のコードを
ASTに変換した前提で、
そのASTをTruffleを使って
JVM上で実行させる
今日のソースコード
• Truffle 1.0.0 RC12対応
– https://github.com/jyukutyo/JVM-Math-Language
Truffle
• トラフル(トリュフ)
• 言語実装用フレームワーク
– ASTインタプリタ構築の基盤を提供する
• Graalプロジェクトの一部
– Oracle Labs主導
– https://github.com/graalvm/graal/tree/master/truffle
Truffleでの言語実装
1. AST用ノードクラスを作成
2. Truffleの言語実装に必須のクラスを実装
3. (入出力などの実装)
Truffleでの言語実装
1. AST用ノードクラスを作成
2.
3.
再度
四則演算
四則演算でのノード
• 数値ノード(子ノード:なし)
– BigDecimal
– Long(BigDecimalだけでもよいが、あえて)
• 演算子ノード(子ノード:オペランド2つ)
– Add(+)
– Subtract(-)
– Multiply(*)
– Divide(/)
• 括弧ノード
"-1"といった
書き方はサポートしない
今回のノード
RootNode
MulNode
ParenNode LongNode
LongNode LongNode
AddNode
ノードのクラス図
全ノードの
スーパークラス
ノードのクラス図
かっこに対応する
ノード
演算子ノードのクラス図
Truffleのノードクラス
• Truffle DSL APIを使う
1. 提供されるアノテーションを
実装コードに付与する
2. Truffleのアノテーションプロセッサが
コードを生成する
アノテーションの種類、意味は
Javadocを読むしかない
(ドキュメントは整備されていない)
(なお、アノテーションで、
JITコンパイルにおける
部分評価の範囲なども
設定できる)
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
数値ノード
@NodeInfo(shortName = "const")
public class LongNode extends JvmMathLangNode {
private final long value;
public LongNode(long l) {
this.value = l;
}
public long executeLong(VirtualFrame frame) {
return this.value; }
@Override
public Object executeGeneric(VirtualFrame frame) {
return this.value;
}
}
加算ノード
@NodeInfo(shortName = "+")
public abstract class AddNode extends BinaryNode {
@Specialization(rewriteOn = ArithmeticException.class)
@TruffleBoundary
protected long add(long left, long right) {
return Math.addExact(left, right);
}
@Specialization
@TruffleBoundary
protected BigDecimal add(BigDecimal left, BigDecimal right) {
return left.add(right);
}
BinaryNode
@NodeChildren({ @NodeChild("leftNode"), @NodeChild("righrNode") })
public abstract class BinaryNode extends JvmMathLangNode {
}
子ノードを持つノード
(演算子ノードなど)
の実際の処理は、
アノテーションプロセッサが
自動生成する
ノードのクラス図
Truffleのアノテーションプロセッサが生成する
自動生成コードを
見ましょう
Truffleでの言語実装
1.
2. Truffleの言語実装に必須のクラスを実装
3.
言語を定める
クラスを作る
com.oracle.truffle.api.
TruffleLanguageクラス
を継承して実装する
CallTarget parse(ParsingRequest r)
実装する必要があるのは
この1メソッドのみ
CallTarget parse(ParsingRequest r)
Truffleのエンジンが
このメソッドを
呼び出す
クラス 説明
ParsingRequest
getSource()で
実行するプログラムを取得する
CallTarget
Truffle.getRuntime()
.createCallTarget(RootNode)で生
成できる
CallTarget parse(ParsingRequest r)
言語規定クラス
@TruffleLanguage.Registration(id = "jvmmathlang",
name = "JVM Math Language", version = "0.0.2")
public class JvmMathLang
extends TruffleLanguage<JvmMathLangContext> {
@Override
protected CallTarget parse(ParsingRequest r) throws Exception {
JvmMathLangRootNode main = parseSource(r.getSource());
return Truffle.getRuntime().createCallTarget(main);
}
parseSource()内で、
字句解析、構文解析、
AST構築をする
parseSource()を
見ましょう
Truffleでの言語実装
1.
2.
3. (入出力などの実装)
入出力
実行したいプログラムを
Truffleのエンジンに
どのように渡し、
結果をどのように
受け取るか?
メインクラス
public class JvmMathLangMain {
public static void main(String[] args) throws IOException {
Context context = Context.create("jvmmathlang");
Object answer = runCode(context, [PROGRAM_FOR_RUN]);
}
private static Object runCode(Context context, String program)
throws IOException {
Source source = Source.newBuilder("jvmmathlang", program,
"MATH").build();
Value value = context.eval(source);
return value;
}
}
Context#eval(Source)すると
CallTarget parse(ParsingRequest)
を経由してプログラムが実行され、
結果がValueインスタンスで返ってくる
実行
• TruffleのJARファイルを追加して、HotSpot
VM上でも実行可能
– なお、Java 10から、Graalはデフォルトで
入っている(Experimental)
• GraalVM上でも実行可能
– Truffle言語をGraalVMで動かす - きしだのHatena
• http://nowokay.hatenablog.com/entry/20190104/1546620114
よりTruffleを学ぶには
• コードを読むしかありません
まとめ
Truffleで、
あなたもオレオレ言語を
JVM上で実行できる!
Truffle言語には
Interoperability
がある
単体の言語を
高パフォーマンスに
実行できるだけではない
例) JavaScriptコードから
Rubyコードを
“低コスト”で呼び出せる
JavaScriptからRuby
js>vararray= Polyglot.eval("ruby","[1,2,42,4]")
js> array[2]
42
[GRAALVM_HOME]/bin/polyglot --shell --jvm
https://www.sakatakoichi.com/entry/graalvmpolyglot
Chromeでのデバッグ
Graal &Truffle
• Graalは言語実装そのものは知らない
– Truffleを間に挟んでいる(JVM言語以外)
• JITコンパイルでは(結果として)
複数言語にまたがったコンパイルができる
call call
call many times
call call
今日のソースコード
• Truffle 1.0.0 RC12対応
– https://github.com/jyukutyo/JVM-Math-Language
ThankYou
for Coming!
ANTLRの書籍
加算ノード
@NodeInfo(shortName = "+")
public abstract class AddNode extends BinaryNode {
@Specialization
@TruffleBoundary
protected BigDecimalTruffleObject add(Object left, Object right) {
BigDecimal l = left instanceof BigDecimalTruffleObject ?
((BigDecimalTruffleObject) left).getValue() : BigDecimal.valueOf((long)
left);
BigDecimal r = right instanceof BigDecimalTruffleObject ?
((BigDecimalTruffleObject) right).getValue() :
BigDecimal.valueOf((long) right);
return new BigDecimalTruffleObject(l.add(r));
}
}

More Related Content

PPTX
FINAL FANTASY Record Keeperのマスターデータを支える技術
PPTX
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
PDF
GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
PDF
IoT時代におけるストリームデータ処理と急成長の Apache Flink
PPTX
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
PDF
開発とテストが一体となったソフトウェア開発
PDF
GPU Container as a Serviceを実現するための最新OSS徹底比較 - OpenStack最新情報セミナー 2017年7月
PDF
Power Automateで電子帳簿保存法に対応してみた。
FINAL FANTASY Record Keeperのマスターデータを支える技術
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMの紹介とTruffleでPHPぽい言語を実装したら爆速だった話
IoT時代におけるストリームデータ処理と急成長の Apache Flink
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
開発とテストが一体となったソフトウェア開発
GPU Container as a Serviceを実現するための最新OSS徹底比較 - OpenStack最新情報セミナー 2017年7月
Power Automateで電子帳簿保存法に対応してみた。

What's hot (20)

PDF
邪道Jenkins
PDF
サイボウズの開発を支える GitHub × CircleCI
PPTX
機械学習の定番プラットフォームSparkの紹介
PDF
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
PDF
サーバーのおしごと
PDF
Multipeer connectivityを使った 動画のリアルタイム端末間共有
PPTX
地理分散DBについて
PDF
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PDF
マイクロサービスに至る歴史とこれから - XP祭り2021
PPTX
Akka actorを何故使うのか?
PDF
次世代データ基盤としてのSnowflakeの可能性 SnowDay 20211208
PDF
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
PDF
ストリーム処理を支えるキューイングシステムの選び方
PDF
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −
PDF
工数把握のすすめ 〜WorkTimeプラグインの使い方〜
PDF
Sidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurb
PPT
インフラエンジニアのためのcassandra入門
PPTX
Istioサービスメッシュ入門
PPTX
インセプションデッキ: やらないことリストと トレードオフスライダーをやってる話
PDF
OSSを利用したプロジェクト管理
邪道Jenkins
サイボウズの開発を支える GitHub × CircleCI
機械学習の定番プラットフォームSparkの紹介
サービスブループリントによるシステム設計手法の紹介 - XP祭り2022
サーバーのおしごと
Multipeer connectivityを使った 動画のリアルタイム端末間共有
地理分散DBについて
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
マイクロサービスに至る歴史とこれから - XP祭り2021
Akka actorを何故使うのか?
次世代データ基盤としてのSnowflakeの可能性 SnowDay 20211208
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
ストリーム処理を支えるキューイングシステムの選び方
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −
工数把握のすすめ 〜WorkTimeプラグインの使い方〜
Sidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurb
インフラエンジニアのためのcassandra入門
Istioサービスメッシュ入門
インセプションデッキ: やらないことリストと トレードオフスライダーをやってる話
OSSを利用したプロジェクト管理
Ad

Similar to GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう (20)

PPTX
Great Ideas in GraalVM
PDF
Groovy Bootcamp 2015 by JGGUG
PPTX
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
PDF
Scalaでのプログラム開発
PDF
全部入り!WGPで高速JavaScript+HML5体験
PDF
Getting Started GraalVM (再アップロード)
PDF
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
PDF
VMを改めて学んで見る
PDF
TruffleSqueakの紹介
PDF
Pyconjp2014_implementations
PDF
Web技術勉強会 第31回
PPTX
20130228 Goノススメ(BPStudy #66)
PDF
GoでMinecraftっぽいの作る
PDF
DLR言語によるSilverlightプログラミング
PPTX
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
PPTX
Introduction to GraalVM
PDF
Firefoxの開発プロセス
PPTX
Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)
PPTX
Golang tokyo #7 qtpm
PPTX
Javaで簡単にgpgpu aparapi
Great Ideas in GraalVM
Groovy Bootcamp 2015 by JGGUG
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
Scalaでのプログラム開発
全部入り!WGPで高速JavaScript+HML5体験
Getting Started GraalVM (再アップロード)
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
VMを改めて学んで見る
TruffleSqueakの紹介
Pyconjp2014_implementations
Web技術勉強会 第31回
20130228 Goノススメ(BPStudy #66)
GoでMinecraftっぽいの作る
DLR言語によるSilverlightプログラミング
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
Introduction to GraalVM
Firefoxの開発プロセス
Guide to GraalVM (Oracle Groundbreakers APAC 2019 Tour in Tokyo)
Golang tokyo #7 qtpm
Javaで簡単にgpgpu aparapi
Ad

More from Koichi Sakata (20)

PPTX
Introduction to JIT Compiler in JVM
PPTX
Guide to GraalVM (JJUG CCC 2019 Fall)
PPTX
Introduction to GraalVM and Native Image
PPTX
Bytecode Manipulation with a Java Agent and Byte Buddy
PPTX
Graal in GraalVM - A New JIT Compiler
PPTX
Kanjava 201804 Java News
PPTX
KanJava 201804 Career 思い込みから逃れた先には、可能性がある
PPTX
from Java EE to Jakarta EE
PPTX
Java release cadence has been changed and about Project Amber
PPTX
KANJAVA PARTY 2017 前説
PPTX
JJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めた
PPTX
“Purikura” culture in Japan and our web application architecture
PPTX
デブサミ2017 Javaコミュニティ作ったら人生変わった
PPTX
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
PPTX
日本からJavaOneに行こう!
PPTX
Seasar2で作った俺たちのサービスの今
PDF
How Scala code is expressed in the JVM
PDF
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
PDF
DevLOVE関西 5年目、10年目の自分戦略 20141030
PDF
JITコンパイルはじめの一歩
Introduction to JIT Compiler in JVM
Guide to GraalVM (JJUG CCC 2019 Fall)
Introduction to GraalVM and Native Image
Bytecode Manipulation with a Java Agent and Byte Buddy
Graal in GraalVM - A New JIT Compiler
Kanjava 201804 Java News
KanJava 201804 Career 思い込みから逃れた先には、可能性がある
from Java EE to Jakarta EE
Java release cadence has been changed and about Project Amber
KANJAVA PARTY 2017 前説
JJUG CCC 2017 Spring Seasar2からSpringへ移行した俺たちのアプリケーションがマイクロサービスアーキテクチャへ歩み始めた
“Purikura” culture in Japan and our web application architecture
デブサミ2017 Javaコミュニティ作ったら人生変わった
JJUG CCC 2016 fall バイトコードが君のトモダチになりたがっている
日本からJavaOneに行こう!
Seasar2で作った俺たちのサービスの今
How Scala code is expressed in the JVM
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
DevLOVE関西 5年目、10年目の自分戦略 20141030
JITコンパイルはじめの一歩

GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう