JJUGナイトセミナー GraalVM とその要素技術
2/27 に行われた 【東京】 JJUGナイトセミナー「JVM言語を作ろう! GraalVMで遊ぼう!」 - 日本Javaユーザーグループ/Japan Java User Group | Doorkeeper に参加してきた。
以下メモ。
JVM 言語の動き方・動かし方 by @miyakawa_taku
言語処理系の基礎知識の話。 JVM 言語の話としてまとまっているので良い資料になっている。
インタプリタの種類としては次が紹介されていた。
Meta-cricular インタプリタは名前を知らなかったが、AST などの木構造を再帰的に手繰って計算する方式らしい。 ホスト言語の制御構造を利用できると同時にその制約も受けてしまうとのこと。
Kink の紹介
引き続き自前の JVM 言語処理系の話。
Kink 言語の特徴としては:
- 継承なしのオブジェクトシステム
- trait 付きのプロトタイプベースのような感じ?
- 限定継続(限定=範囲付きの継続)
- Qcode というバイトコードを用意して JVM の上のインタプリタで実行
- GC は JVM のものを利用
性能は現状ではいまいちだが、次のような性能改善が考えられるとrのこと:
GraalVM で使われている、他言語をJVMに実装する仕組みを学ぼう by @jyukutyo
www.slideshare.net
GraalVM は Hostspot VM を基にしたもので、次のものから構成されている:
- Graal -- Jit コンパイラ
- Truffle -- 言語実装のフレームワーク
- JVM CI -- JVM compiler interface
- Substrate VM -- java AOIT のランタイムライブラリ
GraalVM でできることはたくさんあって、 すでに JavaScript,Ruby,R,LLVM,sulong は GraalVM で動かせるようになっている。 かつ R はかなり早くなっているらしい。
Truffle で言語実装入門 @kis
後半は Truffle の話。 Truffle は動的なプログラミング言語を作るライブラリで、AST のインタプリタ。 一度 AST ができれば、後は Graal と JVM に任せられ、ランタイムを構築する必要はない。
Truffleのメリット:
- 言語が高速に実行できる
- Truffle には Interoperability 相互呼び出しができる
- JavaScript から Ruby を「高速」に呼び出せる
- Chrome 上でデバッグができたり
Truffle での言語実装は次のように行う。
- Truffle の言語実装に必須のクラスを実装
parseSource()
で字句解析、構文解析を実装するなど
- 入出力の準備
- 要するに Truffle を呼び出す部分も作る
現状 Truffle を学ぶには、現状コードを読むしかない。 なかでは SimpleLanguage がおすすめ、というかそのための言語になっている。
Truffle + PHPぽい言語 by @kis
Truffle で php っぽい言語を作った話。
パーサは jparsec(https://github.com/jparsec/jparsec) を利用して、php の一部だけを実装している。
Truffle のコンセプトは「動的な値だけ受け取るインタプリタ」で静的な部分は前もって取り込んでおく。 Truffle がやることは Specialization
- 最適な評価方法を選んでくれる
- メソッド呼び出しの最適化
Truffle で書いた言語は書いたとおりには動かず、かなり最適化されるとのこと。 例外、オブジェクト生成も最適化され、jmp になったり、そもそも生成されなかったりする。
おすすめの Truffle 学習方法:
- SimpleLanguage からコピペ
- gitter で聞く
- Writing a Launguage in Truffle(http://cesquivias.github.io/blog/2014/10/13/writing-a-language-in-truffle-part-1-a-simple-slow-interpreter/) を読む
感想etc
この話を聞いてから自分でも SimpleLanguage のコードを見てみたがなかなか分かりづらい。 いわれてたようにコピペから始めたほうが良さそう。
話を聞く前はもうちょっと簡単にできるんだろうかと思ったが、コンパイラフロントエンド相当の部分はがっつり書く必要がありそうだ。 それとそもそも Java がつらい部分はある。
あと Java だとパーサーは Antlr 使うことになりそうなので、やるんだったら Antlr も抑えておいたほうが良さそうだなあ。