@ LL Future

2008/08/30
MORITA Hajime <omo@dodgson.org>
http://steps.dodgson.org/

自己紹介: 森田創●●

本業
雑用系 C++ プログラマ なぜここに....
今日の立ち位置
ActionScript VM 「Tamarin」 擁護派（という設定）–

ActionScript はよくわからないけど–Tamarin は C++ なので安心Tamarin との馴れ初め

http://flickr.com/photos/colodio/1439836270/

Tamarin との馴れ初め
2006/11/07「Adobeが Flash(の何か)をオープンソース化！」
http://weblogs.mozillazine.org/roadmap/archives/2006/11/project_tamarin.html●

Adobe のすばらしい C++のコード※が読める！！

●

Flash のレンダリングエンジンが読める！！！

※Adobe Source Libraries
http://stlab.adobe.com/

cvs -d :pserver:anonymous@cvs.mozilla.org:/cvsroot mozilla/js/tamarinTamarin との馴れ初め2006/11/07「Adobeが Flash(の何かVM)をオープンソース化！」
http://weblogs.mozillazine.org/roadmap/archives/2006/11/project_tamarin.html

Adobe のすばらしい C++のコード※が読める！！
すばらしくなかった・・・● Flash のレンダリングエンジンが読める！！！
入ってなかった・・・●Tamarin との馴れ初め
●

読んだら情が湧いた– あれで少しはいいところ(JIT)もあるの...
– いまさら別れるなんて...

●

ActionScript にも興味がでた– 複雑な言語仕様+強力なプラットホーム– Yet Another BK Language の誕生か？
– もう C++ (とperl) だけじゃない！
– 食い扶持にはこまらなそうだ！

Tamarin みどころ●

床屋談義な面白さ– オープン vs クローズド: Mozilla vs. Adobe– 標準規格 vs 独自規格 : HTML+JS vs. Flash●テクニカルな面白さ– 動的言語と JIT(Tracing JIT)

– VM 性能対決: vs. SpiderMonkey, vs. SquirrelFish– 超巨大レガシー(Gecko)との統合

自己紹介ここまで

FlashCC by Adobe●

実験的な LLVM Backend●

LLVM -> ABC (ActionScript Bytecode)– 実物はなし– 資料はあり“Flash C Compiler: Compiling C code to the Adobe Flash Virtual Machine”
http://llvm.org/devmtg/2008-08/Petersen_FlashCCompiler.pdf– Doom が動くらしい (Adobe MAX でデモ)
“Flash on C/C++ Sneak Peek”
http://jp.youtube.com/watch?v=0hX-Uh3oTcE–割とさくさくうごいてびびる(受け売りです)application.c

llvm-gcc
gcc

application.bc

LLVM

application.o(exe)application.abc(swf)

OS+CPU

Flash VM

素朴な疑問●メモリ/ポインタどうするの？

●

スレッド/ブロッキングどうするの？

●

システムコールどうするの？

メモリ = ByteArray●●

バイト列 (std::vector<char>, ruby の String, ...)JIT の Intrinsics:
API 呼び出しが機械語にスレッド = 有限状態マシン

スライドは借り物ですシステムコール●

ランタイム(Flash)を改造だから公開デモがないのか...

●

標準ライブラリは BSD のソースをコンパイル– バイトコードに！

ベンチマーク

スライドは借り物ですFlashCC ここまで

Tamarin Tracing と TraceMonkey

Tamarin as JavaScript VM
苦労が多い
静的型がないと遅い● eval() がない (コンパイラがないから...)●●SpiderMonkey から乗り換えるの大変– Native API (DOM, XPCOM, ...)
– バイトコード– GC (Write barrier, Deferred ref-counting)– ...

Tamarin Tracing●

静的型がないと遅い
ムリヤリ速くするアルゴリズムの登場

Tamarin Tracing vs. JavaScript
function SquareDoubler() {this.squarer = new Squarer();this.make_double_square = function(x) {return this.make_square(x) +this.make_square(x);};};
型わからず
var n = 0;
var sd = new SquareDoubler();for (var i=0; i<arr.size; ++i) {sd.make_double_square(arr[i]);}要ハッシュ表検索

var i=0;
var n=0;var sd = new SquareDoubler();
if (i instaceof int) {型チェック+確定
var iint:int = (int)int;
if (arr.size instaceof int) {var sizeint:int = arr.size;// これはウソかもfor (; iint<sizeint; i++) {if (sd.make_double_square == ...) {if (sd.squarer.make_square == ...) {if (arr[iint] instanceof int) {var xi:int = (int)arr[iint];
インライン化
var xxxx:int = x*x + x*x;
if (n instaceof int) {var nint:int = n;n = nint + xxxxx;} else { ... }} else { ... }} else { ... }} else { ... }}var i=0;
var n=0;var sd = new SquareDoubler();
if (i instaceof int) {チェックを外へ
var iint:int = (int)int;
if (sd.make_double_square == ...) {if (sd.squarer.make_square == ...) {if (arr.size instanceof int) {var sizeint:int = arr.size;
if (n instanceof int) {var nint:int = n;
for (; iint<sizeint; i++) {if (arr[iint] instanceof int) {var xi:int = (int)arr[iint];
var xxxx:int = x*x + x*x;
nint = nint + xxxxx;}}} else { ... }(たぶんまだ未実装)} else { ... }} else { ... }Tamarin as JavaScript VM
苦労が多い
静的型がないと遅い● eval() がない (コンパイラがないから...)●●SpiderMonkey から乗り換えるの大変– Native API (DOM, XPCOM, ...)
– バイトコード– GC (Write barrier, Deferred ref-counting)– ...

Tamarin vs. SpiderMonkey(no Compiler)

SM Compiler

ABC Interpreter

SM Interpreter

Array,
String...

JIT(no JIT)

Array,
String...

GC(no DOM)

DOM(Gecko)

GCTamarin

SpiderMonkey

常考な Tamarin 移植(no Compiler)

SM CompilerABC Interpreter

SM Interpreter

Array,
String...

JIT(no JIT)

Array,
String...

GC(no DOM)

DOM(Gecko)

GC

TamarinSpiderMonkey

常考な Tamarin 移植: 依存の困難(no Compiler)

SM Compiler

ABC Interpreter

SM Interpreter

Array,
String...

JIT(no JIT)

Array,
String...

GC(no DOM)

DOM(Gecko)GC

TamarinSpiderMonkey

常考な Tamarin 移植: サイズの困難(no Compiler)

SM Compiler

ABC Interpreter

SM Interpreter

Array,
String, ...

GC

JIT

(no DOM)

Tamarin(no JIT)DOM(Gecko)Array,
String, ...

GC

SpiderMonkey

TraceMonkey(no Compiler)

SM Compiler

ABC Interpreter

SM Interpreter

Array,
String, ...

GC

JIT

(no DOM)

Tamarin(no JIT)DOM(Gecko)Array,
String, ...

GC

SpiderMonkeyベンチマーク結果

http://weblogs.mozillazine.org/roadmap/archives/2008/08/tracemonkey_javascript_lightsp.html

むりやりまとめ●JavaScript も速くなる！

●

C++ プログラマの将来やいかに！

スライドここまで