+ All Categories
Home > Documents > Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I...

Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I...

Date post: 16-Aug-2020
Category:
Upload: others
View: 5 times
Download: 0 times
Share this document with a friend
89
Opeth, Lua VM Bytecode Optimizer Nymphium February 12, 2017 at tsukuba.lua
Transcript
Page 1: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth,

Lua VMBytecode Optimizer

Nymphium

February 12, 2017 at tsukuba.lua

Page 2: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 3: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Intro

こんにちは、びしょ〜じょです。I ここの大学に 4年滞在中の 3年生I Lua/MoonScriptをよく書くI ライトなメタラー

Intro 1/37

Page 4: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•流れ

1. tsukuba.pmというイベントで Luaのバイトコード解析 *1

2. あまり最適化されてないことが判明3. optimizer作るか

*1 http://nymphium.github.io/pdf/tsukubapm3-luavm.html

Intro 2/37

Page 5: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 6: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Lua is . . . . . .

I 弱い動的型付けなスクリプト言語I 文法が簡単、予約語も 22個と少ない

I 関数がファーストクラスI ナウい関数型プログラミングも可能

I 唯一のデータ構造 tableI 簡単に言うと連想配列I オブジェクトは全部キーにも要素にもI メタテーブルで色々拡張

Intro.Lua is . . . . . . 3/37

Page 7: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Lua is . . . . . .

I 弱い動的型付けなスクリプト言語I 文法が簡単、予約語も 22個と少ないI 関数がファーストクラス

I ナウい関数型プログラミングも可能

I 唯一のデータ構造 tableI 簡単に言うと連想配列I オブジェクトは全部キーにも要素にもI メタテーブルで色々拡張

Intro.Lua is . . . . . . 3/37

Page 8: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Lua is . . . . . .

I 弱い動的型付けなスクリプト言語I 文法が簡単、予約語も 22個と少ないI 関数がファーストクラス

I ナウい関数型プログラミングも可能I 唯一のデータ構造 table

I 簡単に言うと連想配列I オブジェクトは全部キーにも要素にもI メタテーブルで色々拡張

Intro.Lua is . . . . . . 3/37

Page 9: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 10: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Implementations

I (PUC-Lua)I リオデジャネイロ・カトリカ大学開発の、いわゆる本家I 軽量、組み込みで広く活躍

I LuaJITI だいぶ速い。FFIモジュールなども提供

I LuaJ、RembulanI JVM実装。

I その他色々

Intro.Implementations 4/37

Page 11: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Implementations

I (PUC-Lua)I リオデジャネイロ・カトリカ大学開発の、いわゆる本家I 軽量、組み込みで広く活躍

I LuaJITI だいぶ速い。FFIモジュールなども提供

I LuaJ、RembulanI JVM実装。

I その他色々

Intro.Implementations 4/37

Page 12: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Implementationsその他

I llixI 拙作。例外処理構文を追加

I TypedLuaI 型アノテーション、型定義ファイルなど。トランスパイラI GSoCで募集してたり *2

I RaviI LLVM+Luaの文法+α。別言語

I TerraI multi-stage programming

I MoonScriptI altLua的なモノ。

ちょっとコントリビュート

*2 https://summerofcode.withgoogle.com/archive/2016/organizations/4733835644239872/

Intro.Implementations 5/37

Page 13: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Implementationsその他

I llixI 拙作。例外処理構文を追加

I TypedLuaI 型アノテーション、型定義ファイルなど。トランスパイラI GSoCで募集してたり *2

I RaviI LLVM+Luaの文法+α。別言語

I TerraI multi-stage programming

I MoonScriptI altLua的なモノ。ちょっとコントリビュート

*2 https://summerofcode.withgoogle.com/archive/2016/organizations/4733835644239872/

Intro.Implementations 5/37

Page 14: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 15: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•About Lua VM

I PUC-LuaI レジスターベース (Lua 5.0〜)I 関数呼び出しはレジスターウィンドウI 47個の命令 (Lua 5.3)

Intro.About Lua VM 6/37

Page 16: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•IntroLua VM, register-based Virtual Machine

Lua source bytecodecompile

(run on the VM)

積極的に最適化が行われない

1 local x = 32 local y = 53 print(x + y)

⇒compile

1 LOADK 0 02 LOADK 1 13 GETTABUP 2 0 -34 ADD 3 0 15 CALL 2 2 16 RETURN 0 1

Intro.About Lua VM 7/37

Page 17: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•IntroLua VM, register-based Virtual Machine

Lua source bytecodecompile

(run on the VM)

積極的に最適化が行われない

1 local x = 32 local y = 53 print(x + y)

⇒compile

1 LOADK 0 02 LOADK 1 13 GETTABUP 2 0 -34 ADD 3 0 15 CALL 2 2 16 RETURN 0 1

Intro.About Lua VM 7/37

Page 18: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•IntroLua VM, register-based Virtual Machine

Lua source bytecodecompile

(run on the VM)

積極的に最適化が行われない

1 local x = 32 local y = 53 print(x + y)

⇒compile

1 LOADK 0 02 LOADK 1 13 GETTABUP 2 0 -34 ADD 3 0 15 CALL 2 2 16 RETURN 0 1

Intro.About Lua VM 7/37

Page 19: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•IntroLua VM, register-based Virtual Machine

Lua source bytecodecompile

(run on the VM)

積極的に最適化が行われない

1 local x = 32 local y = 53 print(x + y)

⇒compile

1 LOADK 0 02 LOADK 1 13 GETTABUP 2 0 -34 ADD 3 0 15 CALL 2 2 16 RETURN 0 1

コンパイル時に値が ↑分かる (定数化可能)

Intro.About Lua VM 7/37

Page 20: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•IntroLua VM, register-based Virtual Machine

Lua source bytecodecompile

(run on the VM)

積極的に最適化が行われない

1 local x = 32 local y = 53 print(x + y)

⇒compile

1 LOADK 0 02 LOADK 1 13 GETTABUP 2 0 -34 ADD 3 0 15 CALL 2 2 16 RETURN 0 1

コンパイル時に値が ↑分かる (定数化可能)

足し算の結果が分かればこの定数はいらない →

Intro.About Lua VM 7/37

Page 21: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 22: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Opeth

Q. Do you know ametal band,Opeth ?

Figure: Opeth、新譜出すってよ

Opeth 8/37

Page 23: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Opeth

Q. Do you know ametal band,Opeth ?

Figure: Opeth、新譜出すってよOpeth 8/37

Page 24: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Opeth

つくったoptimizer

Opeth

I https://github.com/Nymphium/opeth

I 『情報特別演習 II』*3 という通年の講義で制作I コマンドラインから使用可能I モジュールとしても使える

*3 http://www.coins.tsukuba.ac.jp/syllabus/GB13312_GB13322.html

Opeth 9/37

Page 25: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 26: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

デモ

Opeth.Demo 10/37

Page 27: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Demo

optimizer = require'opeth.opeth'

f = -> ............

g =::::::::::::::::optimizer f

g! -- wow

Opeth.Demo 11/37

Page 28: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 29: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Architecture

Source

bytecode

analyzed data

ControlFlow Graph& DU Chain

optimizerI Constant Folding

I Constant Propagation

I Dead-code Elimination

I Function Inlining

I Unreachable Block Removal

I Unused Resource Removal

optimizedbytecode

Figure: optimization imageImplementation.Architecture 12/37

Page 30: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 31: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Bytecode

Lua VM 5.3のバイトコードを操作したい

⇒ バイトコードのdocumentはない

⇒自分で読み解くしかない

Implementation.Bytecode 13/37

Page 32: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Bytecode

Lua VM 5.3のバイトコードを操作したい

⇒ バイトコードのdocumentはない

⇒自分で読み解くしかない

Implementation.Bytecode 13/37

Page 33: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Bytecode有志の非公式ドキュメント

I Lua VM 5.3 instructions (bytecodeではない)*4I Lua VM 5.1 reference*5

Lua VM bytecodeを読むためのツールI luac -l -l luac.outI xxd -g 1 luac.out | nvim - -RI ソースコード *6

簡単に言うと気合

*4 https://github.com/dibyendumajumdar/ravi/blob/master/readthedocs/lua_bytecode_reference.rst

*5 http://luaforge.net/docman/83/98/ANoFrillsIntroToLua51VMInstructions.pdf

*6 https://www.lua.org/source

Implementation.Bytecode 14/37

Page 34: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Bytecode有志の非公式ドキュメント

I Lua VM 5.3 instructions (bytecodeではない)*4I Lua VM 5.1 reference*5

Lua VM bytecodeを読むためのツールI luac -l -l luac.outI xxd -g 1 luac.out | nvim - -R

I ソースコード *6

簡単に言うと気合

*4 https://github.com/dibyendumajumdar/ravi/blob/master/readthedocs/lua_bytecode_reference.rst

*5 http://luaforge.net/docman/83/98/ANoFrillsIntroToLua51VMInstructions.pdf

*6 https://www.lua.org/source

Implementation.Bytecode 14/37

Page 35: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Bytecode有志の非公式ドキュメント

I Lua VM 5.3 instructions (bytecodeではない)*4I Lua VM 5.1 reference*5

Lua VM bytecodeを読むためのツールI luac -l -l luac.outI xxd -g 1 luac.out | nvim - -RI ソースコード *6

簡単に言うと気合

*4 https://github.com/dibyendumajumdar/ravi/blob/master/readthedocs/lua_bytecode_reference.rst

*5 http://luaforge.net/docman/83/98/ANoFrillsIntroToLua51VMInstructions.pdf

*6 https://www.lua.org/source

Implementation.Bytecode 14/37

Page 36: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Bytecode有志の非公式ドキュメント

I Lua VM 5.3 instructions (bytecodeではない)*4I Lua VM 5.1 reference*5

Lua VM bytecodeを読むためのツールI luac -l -l luac.outI xxd -g 1 luac.out | nvim - -RI ソースコード *6

簡単に言うと気合*4 https://github.com/dibyendumajumdar/ravi/blob/master/readthedocs/lua_bytecode_reference.rst

*5 http://luaforge.net/docman/83/98/ANoFrillsIntroToLua51VMInstructions.pdf

*6 https://www.lua.org/source

Implementation.Bytecode 14/37

Page 37: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Bytecode

print("hello, world!")

$ luac -l -l luac.out

main <hello.lua:0,0> (4 instructions at0x16e79e0)

0+ params, 2 slots, 1 upvalue, 0 locals,2 constants, 0 functions

1 [1] GETTABUP 0 0 -1 ; _ENV "print"2 [1] LOADK 1 -2 ; "hello, world!"3 [1] CALL 0 2 14 [1] RETURN 0 1

constants (2) for 0x16e79e0:1 "print"2 "hello, world!"

locals (0) for 0x16e79e0:upvalues (1) for 0x16e79e0:0 _ENV 1 0

$ xxd -g 1 luac.out00000000: 1b 4c 75 61 53 00 19 93 0d 0a 1a 0a 04 08 04 08 .LuaS...........00000010: 08 78 56 00 00 00 00 00 00 00 00 00 00 00 28 77 .xV...........(w00000020: 40 01 0b 40 68 65 6c 6c 6f 2e 6c 75 61 00 00 00 @[email protected]: 00 00 00 00 00 00 02 02 04 00 00 00 06 00 40 00 [email protected]: 41 40 00 00 24 40 00 01 26 00 80 00 02 00 00 00 A@..$@..&.......00000050: 04 06 70 72 69 6e 74 04 0e 68 65 6c 6c 6f 2c 20 ..print..hello,00000060: 77 6f 72 6c 64 21 01 00 00 00 01 00 00 00 00 00 world!..........00000070: 04 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 ................00000080: 01 00 00 00 00 00 00 00 01 00 00 00 05 5f 45 4e ............._EN00000090: 56 V

???

Implementation.Bytecode 15/37

Page 38: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Bytecode

print("hello, world!")

$ luac -l -l luac.out

main <hello.lua:0,0> (4 instructions at0x16e79e0)

0+ params, 2 slots, 1 upvalue, 0 locals,2 constants, 0 functions

1 [1] GETTABUP 0 0 -1 ; _ENV "print"2 [1] LOADK 1 -2 ; "hello, world!"3 [1] CALL 0 2 14 [1] RETURN 0 1

constants (2) for 0x16e79e0:1 "print"2 "hello, world!"

locals (0) for 0x16e79e0:upvalues (1) for 0x16e79e0:0 _ENV 1 0

$ xxd -g 1 luac.out00000000: 1b 4c 75 61 53 00 19 93 0d 0a 1a 0a 04 08 04 08 .LuaS...........00000010: 08 78 56 00 00 00 00 00 00 00 00 00 00 00 28 77 .xV...........(w00000020: 40 01 0b 40 68 65 6c 6c 6f 2e 6c 75 61 00 00 00 @[email protected]: 00 00 00 00 00 00 02 02 04 00 00 00 06 00 40 00 [email protected]: 41 40 00 00 24 40 00 01 26 00 80 00 02 00 00 00 A@..$@..&.......00000050: 04 06 70 72 69 6e 74 04 0e 68 65 6c 6c 6f 2c 20 ..print..hello,00000060: 77 6f 72 6c 64 21 01 00 00 00 01 00 00 00 00 00 world!..........00000070: 04 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 ................00000080: 01 00 00 00 00 00 00 00 01 00 00 00 05 5f 45 4e ............._EN00000090: 56 V

???

Implementation.Bytecode 15/37

Page 39: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Bytecode

print("hello, world!")

$ luac -l -l luac.out

main <hello.lua:0,0> (4 instructions at0x16e79e0)

0+ params, 2 slots, 1 upvalue, 0 locals,2 constants, 0 functions

1 [1] GETTABUP 0 0 -1 ; _ENV "print"2 [1] LOADK 1 -2 ; "hello, world!"3 [1] CALL 0 2 14 [1] RETURN 0 1

constants (2) for 0x16e79e0:1 "print"2 "hello, world!"

locals (0) for 0x16e79e0:upvalues (1) for 0x16e79e0:0 _ENV 1 0

$ xxd -g 1 luac.out00000000: 1b 4c 75 61 53 00 19 93 0d 0a 1a 0a 04 08 04 08 .LuaS...........00000010: 08 78 56 00 00 00 00 00 00 00 00 00 00 00 28 77 .xV...........(w00000020: 40 01 0b 40 68 65 6c 6c 6f 2e 6c 75 61 00 00 00 @[email protected]: 00 00 00 00 00 00 02 02 04 00 00 00 06 00 40 00 [email protected]: 41 40 00 00 24 40 00 01 26 00 80 00 02 00 00 00 A@..$@..&.......00000050: 04 06 70 72 69 6e 74 04 0e 68 65 6c 6c 6f 2c 20 ..print..hello,00000060: 77 6f 72 6c 64 21 01 00 00 00 01 00 00 00 00 00 world!..........00000070: 04 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 ................00000080: 01 00 00 00 00 00 00 00 01 00 00 00 05 5f 45 4e ............._EN00000090: 56 V

???Implementation.Bytecode 15/37

Page 40: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Bytecode

1b 4c 75 61 53 00 19 93 0d 0a 1a 0a 04 08 04 0808 78 56 00 00 00 00 00 00 00 00 00 00 00 28 7740 01 0b 40 68 65 6c 6c 6f 2e 6c 75 61 00 00 0000 00 00 00 00 00 02 02 04 00 00 00 06 00 40 0041 40 00 00 24 40 00 01 26 00 80 00 02 00 00 0004 06 70 72 69 6e 74 04 0e 68 65 6c 6c 6f 2c 2077 6f 72 6c 64 21 01 00 00 00 01 00 00 00 00 0004 00 00 00 01 00 00 00 01 00 00 00 01 00 00 0001 00 00 00 00 00 00 00 01 00 00 00 05 5f 45 4e56

header block

function block

Implementation.Bytecode 16/37

Page 41: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Bytecode

1b 4c 75 61 53 00 19 93 0d 0a 1a 0a 04 08 04 0808 78 56 00 00 00 00 00 00 00 00 00 00 00 28 7740 01 0b 40 68 65 6c 6c 6f 2e 6c 75 61 00 00 0000 00 00 00 00 00 02 02 04 00 00 00 06 00 40 0041 40 00 00 24 40 00 01 26 00 80 00 02 00 00 0004 06 70 72 69 6e 74 04 0e 68 65 6c 6c 6f 2c 2077 6f 72 6c 64 21 01 00 00 00 01 00 00 00 00 0004 00 00 00 01 00 00 00 01 00 00 00 01 00 00 0001 00 00 00 00 00 00 00 01 00 00 00 05 5f 45 4e56

header block

function block

Implementation.Bytecode 16/37

Page 42: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Bytecode

1b 4c 75 61 53 00 19 93 0d 0a 1a 0a 04 08 04 0808 78 56 00 00 00 00 00 00 00 00 00 00 00 28 7740 01 0b 40 68 65 6c 6c 6f 2e 6c 75 61 00 00 0000 00 00 00 00 00 02 02 04 00 00 00 06 00 40 0041 40 00 00 24 40 00 01 26 00 80 00 02 00 00 0004 06 70 72 69 6e 74 04 0e 68 65 6c 6c 6f 2c 2077 6f 72 6c 64 21 01 00 00 00 01 00 00 00 00 0004 00 00 00 01 00 00 00 01 00 00 00 01 00 00 0001 00 00 00 00 00 00 00 01 00 00 00 05 5f 45 4e56

header block

function block

Implementation.Bytecode 16/37

Page 43: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 44: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Dataflow analysis

I Control Flow Graph (CFG)I プログラムの流れをグラフで表したもの

I Define-Use / Use-Define Chain (DU/UD Chain)I 変数の定義、使用を調べるI 役割としては SSA、A正規形

Implementation.Dataflow analysis 17/37

Page 45: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Dataflow analysislocal b = true

if b thenprint("hello")

elseprint"world"

end

⇓LOADBOOL 0 1 0TEST 0 0JMP 0 4GETTABUP 1 0 -1LOADK 2 1CALL 1 2 1JMP 0 3GETTABUP 1 0 -1LOADK 2 2CALL 1 2 1RETURN 0 1

main_b1: [1 ~ 2] 1: LOADBOOL 0 1 0 2: TEST 0 0 0

main_b2: [3 ~ 3] 3: JMP 0 4

main_b3: [4 ~ 7] 4: GETTABUP 1 0 -1 5: LOADK 2 1 6: CALL 1 2 1 7: JMP 0 3

main_b4: [8 ~ 10] 8: GETTABUP 1 0 -1 9: LOADK 2 2 10: CALL 1 2 1

main_b5: [11 ~ 11] 11: RETURN 0 1 0

Implementation.Dataflow analysis 18/37

Page 46: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Dataflow analysislocal b = true

if b thenprint("hello")

elseprint"world"

end

⇓LOADBOOL 0 1 0TEST 0 0JMP 0 4GETTABUP 1 0 -1LOADK 2 1CALL 1 2 1JMP 0 3GETTABUP 1 0 -1LOADK 2 2CALL 1 2 1RETURN 0 1

main_b1: [1 ~ 2] 1: LOADBOOL 0 1 0 2: TEST 0 0 0

main_b2: [3 ~ 3] 3: JMP 0 4

main_b3: [4 ~ 7] 4: GETTABUP 1 0 -1 5: LOADK 2 1 6: CALL 1 2 1 7: JMP 0 3

main_b4: [8 ~ 10] 8: GETTABUP 1 0 -1 9: LOADK 2 2 10: CALL 1 2 1

main_b5: [11 ~ 11] 11: RETURN 0 1 0

Implementation.Dataflow analysis 18/37

Page 47: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Dataflow analysislocal b = true

if b thenprint("hello")

elseprint"world"

end

⇓LOADBOOL 0 1 0TEST 0 0JMP 0 4GETTABUP 1 0 -1LOADK 2 1CALL 1 2 1JMP 0 3GETTABUP 1 0 -1LOADK 2 2CALL 1 2 1RETURN 0 1

main_b1: [1 ~ 2] 1: LOADBOOL 0 1 0 2: TEST 0 0 0

main_b2: [3 ~ 3] 3: JMP 0 4

main_b3: [4 ~ 7] 4: GETTABUP 1 0 -1 5: LOADK 2 1 6: CALL 1 2 1 7: JMP 0 3

main_b4: [8 ~ 10] 8: GETTABUP 1 0 -1 9: LOADK 2 2 10: CALL 1 2 1

main_b5: [11 ~ 11] 11: RETURN 0 1 0

Implementation.Dataflow analysis 18/37

Page 48: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 49: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Optimizations

I Constant FoldingI Constant PropagationI Dead-Code EliminationI Function InliningI Unreachable Block RemovalI Unused Resource Removal

Implementation.Optimizations 19/37

Page 50: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Constant Folding

1. 演算命令のオペランドの型を調べて2. table、userdata以外なら

⇐メタメソッドを考慮

3. 値を取ってきて4. 演算をおこない5. 即値命令に swap

Implementation.Optimizations 20/37

Page 51: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Constant Folding

1. 演算命令のオペランドの型を調べて2. table、userdata以外なら

⇐メタメソッドを考慮

3. 値を取ってきて4. 演算をおこない5. 即値命令に swap

Implementation.Optimizations 20/37

Page 52: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Constant Folding

1. 演算命令のオペランドの型を調べて2. table、userdata以外なら⇐メタメソッドを考慮3. 値を取ってきて4. 演算をおこない5. 即値命令に swap

Implementation.Optimizations 20/37

Page 53: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Constant Propagation

1. MOVE命令が参照してる registerの定義位置を見て2. LOADKならMOVEをLOADKにする

I 単体では速度改善なさそうI LOADKへの依存が減るので、他の最適化を有利に進められる

(今回の実装では)いまいちぱっとしない

Implementation.Optimizations 21/37

Page 54: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Constant Propagation

1. MOVE命令が参照してる registerの定義位置を見て2. LOADKならMOVEをLOADKにする

I 単体では速度改善なさそうI LOADKへの依存が減るので、他の最適化を有利に進められる

(今回の実装では)いまいちぱっとしない

Implementation.Optimizations 21/37

Page 55: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Constant Propagation

1. MOVE命令が参照してる registerの定義位置を見て2. LOADKならMOVEをLOADKにする

I 単体では速度改善なさそうI LOADKへの依存が減るので、他の最適化を有利に進められる(今回の実装では)いまいちぱっとしない

Implementation.Optimizations 21/37

Page 56: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Dead-Code Elimination

1. LOADK、MOVE、CLOSURE、LOADNILが生成する registrの使用を調べ

2. 0個の場合命令を消す

I DU/UD Chainのわかりやすい使用例

Implementation.Optimizations 22/37

Page 57: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Dead-Code Elimination

1. LOADK、MOVE、CLOSURE、LOADNILが生成する registrの使用を調べ

2. 0個の場合命令を消す

I DU/UD Chainのわかりやすい使用例

Implementation.Optimizations 22/37

Page 58: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Function Inlining

1. CALL命令が引っ張ってくる closureを見て2. 再帰関数でなければ展開

I register windowの使用を抑えられる

I 実は頼みの綱I バグがヤバい

Implementation.Optimizations 23/37

Page 59: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Function Inlining

1. CALL命令が引っ張ってくる closureを見て2. 再帰関数でなければ展開

I register windowの使用を抑えられる

I 実は頼みの綱I バグがヤバい

Implementation.Optimizations 23/37

Page 60: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Function Inlining

1. CALL命令が引っ張ってくる closureを見て2. 再帰関数でなければ展開

I register windowの使用を抑えられるI 実は頼みの綱

I バグがヤバいア

Implementation.Optimizations 23/37

Page 61: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Function Inlining

1. CALL命令が引っ張ってくる closureを見て2. 再帰関数でなければ展開

I register windowの使用を抑えられるI 実は頼みの綱I バグがヤバい

Implementation.Optimizations 23/37

Page 62: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Unreachable Block Removal

1. 後続ブロックを持たない基本ブロックを丸々削除2. だけ

I 速くはならないがバイトコードのサイズ縮小に貢献

Implementation.Optimizations 24/37

Page 63: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Unused Resource Removal

1. constant list、prototype listから不要なものを削除2. だけ

I 速くはならないがバイトコードのサイズ縮小に貢献

Implementation.Optimizations 25/37

Page 64: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 65: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Benchmark

local function pow(i)return i * i

end

local a = {}

for i = 1, 10000000 doa[i] = pow(i)

end

......FORPREP 2 4MOVE 6 0MOVE 7 5CALL 6 2 2SETTABLE 1 5 6FORLOOP 2 -5......

⇓......FORPREP 2 4MOVE 7 5MUL 8 7 7MOVE 6 8SETTABLE 1 5 6FORLOOP 2 -5......

Benchmark 26/37

Page 66: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Benchmark

local function pow(i)return i * i

end

local a = {}

for i = 1, 10000000 doa[i] = pow(i)

end

......FORPREP 2 4MOVE 6 0MOVE 7 5CALL 6 2 2SETTABLE 1 5 6FORLOOP 2 -5......

⇓......FORPREP 2 4MOVE 7 5MUL 8 7 7MOVE 6 8SETTABLE 1 5 6FORLOOP 2 -5......

Benchmark 26/37

Page 67: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Benchmark

local function pow(i)return i * i

end

local a = {}

for i = 1, 10000000 doa[i] = pow(i)

end

......FORPREP 2 4MOVE 6 0MOVE 7 5CALL 6 2 2SETTABLE 1 5 6FORLOOP 2 -5......

⇓......FORPREP 2 4MOVE 7 5MUL 8 7 7MOVE 6 8SETTABLE 1 5 6FORLOOP 2 -5......

Benchmark 26/37

Page 68: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Benchmark

local function pow(i)return i * i

end

local a = {}

for i = 1, 10000000 doa[i] = pow(i)

end

......FORPREP 2 4MOVE 6 0MOVE 7 5CALL 6 2 2SETTABLE 1 5 6FORLOOP 2 -5......

⇓......FORPREP 2 4MOVE 7 5MUL 8 7 7MOVE 6 8SETTABLE 1 5 6FORLOOP 2 -5......

Benchmark 26/37

Page 69: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Benchmark

local function pow(i)return i * i

end

local a = {}

for i = 1, 10000000 doa[i] = pow(i)

end

......FORPREP 2 4MOVE 6 0MOVE 7 5CALL 6 2 2SETTABLE 1 5 6FORLOOP 2 -5......

⇓......FORPREP 2 4MOVE 7 5MUL 8 7 7MOVE 6 8SETTABLE 1 5 6FORLOOP 2 -5......

Benchmark 26/37

Page 70: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Benchmark

local function pow(i)return i * i

end

local a = {}

for i = 1, 10000000 doa[i] = pow(i)

end

1.4倍の高速化

......FORPREP 2 4MOVE 6 0MOVE 7 5CALL 6 2 2SETTABLE 1 5 6FORLOOP 2 -5......

⇓......FORPREP 2 4MOVE 7 5MUL 8 7 7MOVE 6 8SETTABLE 1 5 6FORLOOP 2 -5......

Benchmark 26/37

Page 71: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

ぶっちゃけ function inlining 以外微妙

もう少し何かいいケースがあればあるいは

Benchmark 27/37

Page 72: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 73: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Tools

今回のマズイ点I ツールなさすぎI 気合では解決できないI 興味が逸れる

ツール制作で英気を養う

Tools 28/37

Page 74: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Tools

今回のマズイ点I ツールなさすぎI 気合では解決できないI 興味が逸れる

ツール制作で英気を養う

Tools 28/37

Page 75: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 76: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•lvis

I これの描画ツール⇒I ちょうどGraphvizの Luabinding(嘘)*7 作ってた

I 目grepから急速文明化

main_b1: [1 ~ 2] 1: LOADBOOL 0 1 0 2: TEST 0 0 0

main_b2: [3 ~ 3] 3: JMP 0 4

main_b3: [4 ~ 7] 4: GETTABUP 1 0 -1 5: LOADK 2 1 6: CALL 1 2 1 7: JMP 0 3

main_b4: [8 ~ 10] 8: GETTABUP 1 0 -1 9: LOADK 2 2 10: CALL 1 2 1

main_b5: [11 ~ 11] 11: RETURN 0 1 0

Figure: visualiseで小学生にも人気

*7 https://github.com/Nymphium/lua-graphviz

Tools.lvis 29/37

Page 77: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 78: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•moonstep

I step-by-step execution Lua VMI gdbを目指したI つい最近関数呼び出し内を追えるように

もっとまともなデバッグツール出してほしい

Tools.moonstep 30/37

Page 79: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•moonstep

I step-by-step execution Lua VMI gdbを目指したI つい最近関数呼び出し内を追えるように

もっとまともなデバッグツール出してほしい

Tools.moonstep 30/37

Page 80: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

デモ

Tools.moonstep 31/37

Page 81: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 82: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•lasmc

I アセンブリみたいに Lua VMの命令を書きたいという願い

I いろいろ機能をたそうとしたら構文がごちゃごちゃになってやる気 0

I 意外にもデバッグに貢献

main: 0 2LOADK 0 0 -- load `3`LOADK 1 1 -- load `5`LOADK 1 2 -- load `7`EQ 0 0 1 -- R(0) == R(1) ?JMP 0 2LOADK 2 2 -- load `7`JMP 0 1LOADK 2 3 -- load `9`RETURN 0 1{3 5 7 9} -- constant list

Tools.lasmc 32/37

Page 83: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 84: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•Conclusion

I 最適化器の実装I 一部高速化に成功I バイトコードの縮小化もぼちぼち

I しんどかったI ドキュメントは書こう

I 課題I 他の最適化も取り入れたい (for展開とか)I 最適化器の最適化!

I アルゴリズムが適当すぎ

Conclusion 33/37

Page 85: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

Opeth, Lua VM Bytecode OptimizerIntro

Lua is . . . . . .Implementations

OtherAbout Lua VM

OpethDemo

ImplementationArchitectureBytecodeDataflow analysis

Control Flow Graph

OptimizationsConstant FoldingConstant PropagationDead-Code EliminationFunction InliningUnreachable Block RemovalUnused Resource Removal

BenchmarkTools

lvismoonsteplasmc

Conclusionappendix

Page 86: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•appendix I

I fonttheKing 26Queen*8

*8 http://www.dfonts.net/the_King__26_Queen_font.font/20679/

appendix 34/37

Page 87: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•appendix I

Nullstone Corporation, Compiler optimizations,http://www.compileroptimizations.com/.Jason D. Davies, Optimizing lua, 2005,https://www.jasondavies.com/optimising-lua/JasonDaviesDissertation.pdf.Ikuo Tanaka, Masataka Sasa, Munahiro Takimoto, and TanWatanabe,コンパイラの基盤技術と実践 –コンパイラ ·インフラストラクチャ coinsを用いて, 2008.

appendix 35/37

Page 88: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•appendix II

Dibyendu Majumdar, Lua 5.3 bytecode reference, http://the-ravi-programming-language.readthedocs.io/en/latest/lua_bytecode_reference.html.Kein-Hong Man, A no-frills introduction to lua 5.1 vminstructions, 2006, http://luaforge.net/docman/83/98/ANoFrillsIntroToLua51VMInstructions.pdf.PUC Rio, source code for lua 5.3,https://www.lua.org/source/5.3/.

appendix 36/37

Page 89: Opeth, Lua VM Bytecode OptimizerIntro こんにちは、びしょ〜じょです。I ここの大学に4年滞在中の3年生 I Lua/MoonScriptをよく書く I ライトなメタラー

•appendix III

Roberto Ierusalimuschy, Luiz Henrique de Figueiredo, andWaldemar Celes, The implementation of lua 5.0, 2003,https://www.lua.org/doc/jucs05.pdf.Michael Schroder, Optimizing lua using run-time typespecialization, 2012,https://www.complang.tuwien.ac.at/anton/praktika-fertig/schroeder/thesis.pdf.

appendix 37/37


Recommended