lv5 The most precise ECMAScript engine








Presenter Notes

iv / lv5

Presenter Notes

背景

  • JavaScriptの発展は目覚ましい
  • ところで
    • JavaScriptには仕様があるというのをご存知でしょうか?

Presenter Notes

ECMA262 - ECMAScript

  • 現行最新版は5.1th
  • 6th (a.k.a. ES.next) rev9 draftが公開されている

Presenter Notes

Spec violations

  • あなたの使っているECMAScript engine, 本当に, 100% 仕様準拠していますか?
  • なんとしてでも, 100%仕様に準拠したengineが欲しい!
    • ですよね?
    • 作りましょう

Presenter Notes

iv / lv5

  • たとえ何があっても仕様準拠を第一に掲げるengine
    • どんなに遅くなろうとも
    • 遅くなるような自体になったら, 独自実装をせず, 仕様を直しに行きましょう
  • spec conformance suite result (test262)

test262

Presenter Notes

Contributions

  • test262にbug reportとか
    • https://bugs.ecmascript.org/show_bug.cgi?id=215
    • https://bugs.ecmascript.org/show_bug.cgi?id=218
    • https://bugs.ecmascript.org/show_bug.cgi?id=270
    • https://bugs.ecmascript.org/show_bug.cgi?id=271
    • https://bugs.ecmascript.org/show_bug.cgi?id=287
    • https://bugs.ecmascript.org/show_bug.cgi?id=294
  • ECMA262のbug reportとか
    • https://bugs.ecmascript.org/show_bug.cgi?id=129
    • https://bugs.ecmascript.org/show_bug.cgi?id=387
    • https://bugs.ecmascript.org/show_bug.cgi?id=417

Presenter Notes

もっと先へ――《加速》したくはないか、少年

アクセル・ワールド - 黒雪姫先輩
  • 高速化したい...

Presenter Notes

railgun: Register VM

  • Register VM
    • Lua, JSCに影響を受けた設計
  • 1 passで効率的なBytecodeを出力
    • heap変数でないものはきちんとvirtual registerに置く
    • Stack VMのpush popを行わず, localへの代入も, virtual registerへ直接書き込む
    • 右辺に代入が存在する場合でも1 passで適切なBytecodeを

Presenter Notes

railgun: result 1

  • argumentsのregisterによる直接指定
function t(a, b) {
  return a + b;
}
[code] local: 0 heap: 0 registers: 1
000000: BINARY_ADD r0 r-9 r-10
000002: RETURN r0

Presenter Notes

railgun: result 2

  • 右辺に代入が存在する場合でも1 passで適切なBytecodeを
function test() {
  var a = 10;
  return a + (a = 20);
}
[code] local: 1 heap: 0 registers: 2
000000: MV r0 k0
000002: MV r1 r0
000004: MV r0 k1
000006: BINARY_ADD r1 r1 r0
000008: RETURN r1

Presenter Notes

もっと先へ――《加速》したくはないか、少年

アクセル・ワールド - 黒雪姫先輩
  • もっと 高速化したい...

Presenter Notes

breaker: JIT Compiler

  • railgunによって出力されるBytecodeを受け取り, Context Threading JIT Compileを行う
  • online assemblerとして xbyak を用い x64 codeを出力

Presenter Notes

breaker: Type Analysis

  • 低コストでそこそこ価値のある型解析を行いたい
    • iterationを行うと, basic blockを表す構造や, bitvector等, 様々なものが必要になる
    • 1 passで高価な構造なしにそこそこ価値のある型解析を
  • basic blockごとに型を解析, virtual register間で伝搬し, constant foldingと型の伝搬を同時に
  • 主に int32_t 演算について特殊化, guardを取り除き, x64で直接扱う
  • 将来的には, backward jump以外についてはmergeを行なってbasic block間での型解析も行う予定

Presenter Notes

benchmark result

SunSpider (ms) V8-Suite (ms)
StackVM 1512.7 10691.2
RegisterVM Later 1136.3 9720.3
JIT (June) 986.0 8460.0
JIT (Latest) 937.9 8130.0

Presenter Notes

benchmark result: 1

Presenter Notes

benchmark result: 2

Presenter Notes

WIP: Machine code level MonoIC