Contenu connexe
Similaire à JJUG CCC 2017 Fall オレオレJVM言語を作ってみる (20)
Plus de Koichi Sakata (20)
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
- 3. CCCと僕
• JJUG CCC 5回目となりました
–2017 Fall
–2017 Spring
–2016 Fall
–2016 Spring
–2015 Spring
- 13. サンプル
(1 + 2) * 3
( 1 + 2 ) * 3
ツリーを
インタプリタに渡し、
定義した
処理を実行させる
- 24. The lexical syntax of Scala is given by the following
grammar in EBNF form
...
Expr ::= (Bindings | [‘implicit’] id | ‘_’) ‘=>’ Expr
| Expr1
Expr1 ::= ‘if’ ‘(’ Expr ‘)’ {nl} Expr [[semi] else Expr]
| ‘while’ ‘(’ Expr ‘)’ {nl} Expr
| ‘try’ ‘{’ Block ‘}’ [‘catch’ ‘{’ CaseClauses ‘}’]
[‘finally’ Expr]
| ‘do’ Expr [semi] ‘while’ ‘(’ Expr ’)’
| ‘for’ (‘(’ Enumerators ‘)’ | ‘{’ Enumerators ‘}’)
{nl} [‘yield’] Expr
| ‘throw’ Expr
| ‘return’ [Expr]
| [SimpleExpr ‘.’] id ‘=’ Expr
| SimpleExpr1 ArgumentExprs ‘=’ Expr
| PostfixExpr
| PostfixExpr Ascription
| PostfixExpr ‘match’ ‘{’ CaseClauses ‘}’
…
The Scala Language Specification Version 2.9
http://www.scala-lang.org/docu/files/ScalaReference.pdf
- 29. $ antlr4 Math.g4
$ javac -cp antlr-4.7-
complete.jar Math*.java
$ grun Math prog –gui
(1 + 2) * 3
^D
- 45. Truffle
• トラフル(トリュフ)
• 言語実装用フレームワーク
– ASTインタプリタ構築の基盤を提供
• Graalプロジェクトの一部
– Graal自体は新しいJITコンパイラ
– Graal/Truffleを含むGraalVMは
多言語実行環境となるJVM(polyglot)
– Oracle Labs主導
– https://github.com/graalvm/graal/tree/master/truffle
- 47. Truffleでの言語実装
• TruffleRuby (Ruby)
– https://github.com/graalvm/truffleruby
• FastR (GNU R)
– https://github.com/graalvm/fastr
• Graal.js (JavaScript)
– ECMAScript 262 Version 6/Node.js
• SimpleLanguage (オレオレ言語)
– https://github.com/graalvm/simplelanguage
– 学習用
- 50. (余談)Graal & Truffle
• Graalは言語実装そのものは知らない
– Truffleを間に挟んでいる(JVM言語以外)
• JITコンパイルでは(結果として)
複数言語にまたがったコンパイルが
できる
- 58. ノードクラス
• Truffle DSL APIを使う
–提供されるアノテーションを
実装コードに付与する
–Truffleのアノテーションプロセッサが
コードを生成する
–アノテーションの種類、意味はJavadoc
を読むしかない
• ドキュメントは整備されていない
- 59. 今回のノード
• 数値ノード(子ノードなし)
– Long
– BigDecimal(これだけでもよかったがあえて2種類)
• 演算子ノード(子ノード:2つ)
– Add(+)
– Subtract(-)
– Multiply(*)
– Divide(/)
• 括弧ノード
今回は”-1”といった
書き方はサポートしない
- 77. CallTarget parse(ParsingRequest r)
1. ParsingRequest#getSource()
.getInputStream()でInputStreamを取得
2. IuputStreamをANTLRのレキサー/パーサーに
渡す
3. ANTLRのツリーをリスナで
Truffleのノードツリーに変換する
4. ルートノードを
Truffle.getRuntime()
.createCallTarget(RootNode)に渡す