More Related Content
Similar to Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
Similar to Indy(Invokedynamic) and Bytecode DSL and Brainf*ck (20)
More from Uehara Junji (17)
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
- 2. JGGUG G*Workshop Z Copyright(C) NTT Software.
自己紹介
上原潤二(@uehaj)
NTTソフトウェア(株)Grails推進室
JGGUG(日本Grails/Groovyユーザグループ)運営委員
書籍:
プログラミングGROOVY(技術評論社)
Grails徹底入門(翔泳社)
ブログ「Grな日々」
GroovyServ, LispBuilder, GVM(JVM
written in Groovy)開発者
2
13年9月20日金曜日
- 3. JGGUG G*Workshop Z Copyright(C) NTT Software.
今日の内容
Indyの基礎
Bytecode DSL
Brainf*ckを実装してみた
G*Magazine Vol.7の宣伝
3
13年9月20日金曜日
- 4. JGGUG G*Workshop Z Copyright(C) NTT Software.
テーマ:Indyで遊びたい
Indy: Java VM上での動的言語の実行を効
率化することを目的とした一連の機能拡張
(JSR 292)
気軽でない
ASM面倒くさい
ByteCode DSLを使おう!
4
13年9月20日金曜日
- 6. JGGUG G*Workshop Z Copyright(C) NTT Software.
ByteCode DSL
Groovyの内部DSLで実現されたJava
バイトコードのアセンブラ
ASMのラッパー
Indy対応! (重要)
6
@groovyx.ast.bytecode.Bytecode
int
fib(int
i)
{
iload
1
iconst_2
if_icmpge
l1
iload
1
_goto
l2
l1
aload
0
iload
1
iconst_2
isub
invokevirtual
'.fib',
'(I)I'
aload
0
iload
1
iconst_1
isub
invokevirtual
'.fib'
,'(I)I'
iadd
l2
ireturn
}
13年9月20日金曜日
- 7. JGGUG G*Workshop Z Copyright(C) NTT Software.
BytecodeDSL
以下で@Grab可
groovyによる実行
7
@GrabResolver(name="maven-‐repox",
root
=
"https://
raw.github.com/uehaj/maven-‐repo/gh-‐pages/snapshot")
@Grab('groovyx.ast.bytecode:groovy-‐bytecode-‐ast:0.2.0-‐
separate-‐asm')
import
groovyx.ast.bytecode.Bytecode
$ groovy fib.groovy
102334155
13年9月20日金曜日
- 8. 3
BytecodeDSLでHello Indy!
8
@GrabResolver(name="maven-‐repo",
root="https://raw.github.com/uehaj/maven-‐repo/gh-‐pages/snapshot")
@Grab("groovyx.ast.bytecode:groovy-‐bytecode-‐ast:0.2.0-‐separate-‐asm")
import
groovyx.ast.bytecode.Bytecode
import
java.lang.invoke.*
import
java.lang.invoke.MethodHandles.Lookup
import
static
org.objectweb.asm.Opcodes.H_INVOKESTATIC
class
HelloIndy
{
public
static
CallSite
bootstrap(Lookup
lookup,
String
methodName,
MethodType
type)
{
assert
methodName
==
'xx'
MethodHandle
mh
=
lookup.findVirtual(java.io.PrintStream,
"println",
MethodType.methodType(void,[String]))
return
new
ConstantCallSite(mh)
}
@Bytecode
static
main(args)
{
getstatic
'java/lang/System.out','Ljava/io/PrintStream;'
ldc
'Hello
Indy'
invokedynamic
'xx',
'(Ljava/io/PrintStream;Ljava/lang/
String;)V',
[H_INVOKESTATIC,
'HelloIndy','bootstrap',
[CallSite,
Lookup,
String,
MethodType]]
vreturn
}
}
13年9月20日金曜日
- 23. 3
Brainf*ckとindy
静的言語だからIndyの意味ない
(MutableCallSite出番なし)
invokedynamicの引数文字列から
一連のMHを連接させたものを
BootStrapメソッドで生成してみる
23
invokedynamic 'dummy', '()V', [H_INVOKESTATIC, 'Brainfuck',
'bootstrap', [CallSite, Lookup, String, MethodType,
String]], '>++++++++'
13年9月20日金曜日
- 26. 3
生成コード
26
static
void
main(String[]
args)
throws
Exception
{
//
Brainfuckからコンバートされたコード
invokedynamic
'dummy',
'()V',
...
'>+++++++++'
_GOTO
tmp1
lab1:
invokedynamic
'dummy',
'()V',
...
'<++++++++>-‐'
tmp1:
getstatic
'.data','[B'
getstatic
'.dp','I'
baload
ifne
lab1
invokedynamic
'dummy',
'()V',
...
'<.>+++++++'
_GOTO
tmp2
lab2:
invokedynamic
'dummy',
'()V',
....
'<++++>-‐'
tmp2:
getstatic
'.data','[B'
getstatic
'.dp','I'
baload
ifne
lab2
invokedynamic
'dummy',
'()V',
....
'<+.+++++++..+
++.'
_GOTO
tmp3
lab3:
:
>+++++++++
[
<++++++++>-
]
<.>+++++++
[
<++++>-
]
<+.+++++++..+++.
13年9月20日金曜日