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

参考画像

  • Monomorphic Inline Caching
  • Global変数の参照速度が向上
  • bytecode levelでの実装は前からあったが, x64 machine code levelでの実装を行なっている

Presenter Notes

shibuya - ES.next

Presenter Notes

esprima

Presenter Notes

esprima - harmony branch

  • ES.next をparseすることを目標に実装を行なっている
    • module declaration
    • import / export declaration
    • arrow function
    • class declaration
    • destructuring assignment
    • etc...

Presenter Notes

ES.nextへ

  • 仕様が完成し, 主要engineが実装するまで待つ?
  • No!
  • draft段階からES.nextを理解して行きましょう!
  • ES.next engine
    • shibuya project

Presenter Notes

Shibuya: ES.next engine

  • lv5から更に一歩進んで, 仕様と実装のAbstract Operationレベルでの一致を目指す
    • どうしてもできないところ以外(yield)
  • GitHub
  • ES5.1で記述する
    • esprimaをparserとして用いる

Presenter Notes

Shibuya: status

{
  class Base {
    sayHello() {
      inspect('base');
    }
  };

  class Derived extends Base {
    sayHello() {
      inspect('derived');
      super();
    }
  };

  let i = new Derived;
  i.sayHello();
}
  • まだまだ全然できていないので, 実装中...

Presenter Notes

bugs in ES.next draft

Presenter Notes

まとめ

  • ECMAScriptの未来は明るい!
  • 楽しい!
  • みなさんもぜひ!

Presenter Notes

ありがとうございました

Presenter Notes