WRESTLING CONTROL FROM WEB BROWSERS...Clojure (ClojureScript) 0.00 0.25 0.50 0.75 1.00 0 10 20 30 40...

Preview:

Citation preview

STOPIFYWRESTLING CONTROL FROM WEB BROWSERS

‣ Sam Baxter ‣ Rachit Nigam ‣ Arjun Guha ‣ Joe Politz ‣ Shriram Krishnamurthi

2

WEB PROGRAMMING ENVIRONMENTS

2

WEB PROGRAMMING ENVIRONMENTS

2

WEB PROGRAMMING ENVIRONMENTS

JAVASCRIPT

THE BROWSER RUNTIME

function foo() {

let i = 0;

while (true) {

i++;

}

}

foo (); RUN

Run

3

JAVASCRIPT

THE BROWSER RUNTIME

function foo() {

let i = 0;

while (true) {

i++;

}

}

foo (); RUN

Run Stop

3

JAVASCRIPT

THE BROWSER RUNTIME

function foo() {

let i = 0;

while (true) {

i++;

}

}

foo (); RUN

Run Stop

Run

EVENT QUEUE

3

JAVASCRIPT

THE BROWSER RUNTIME

function foo() {

let i = 0;

while (true) {

i++;

}

}

foo (); i = 0

i = 1

i = 2

RUN

Run Stop

Run

EVENT QUEUE

3

JAVASCRIPT

THE BROWSER RUNTIME

function foo() {

let i = 0;

while (true) {

i++;

}

}

foo (); i = 0

i = 1

i = 2

RUN

Run Stop

Stop

Run

EVENT QUEUE

3

JAVASCRIPT

THE BROWSER RUNTIME

function foo() {

let i = 0;

while (true) {

i++;

}

}

foo (); i = 0

i = 1

i = 2

i = 147

RUN

Run Stop

Stop

Stop

Run

EVENT QUEUE

3

LANGUAGES THAT COMPILE TO JAVASCRIPT 4

LANGUAGES THAT COMPILE TO JAVASCRIPT 4

MAYBE OTHER LANGUAGES AVOID THIS PROBLEM…

LANGUAGES THAT COMPILE TO JAVASCRIPT

ALL INHERIT THE LIMITATIONS OF WEB BROWSERS!

4

JavaScript

STOPIFY

5

JavaScript

CONTINUATIONS FOR JAVASCRIPT

SAVING THE STACK AT RUNTIME

Stopfunction odd(n) {

if (n == 0) return false;

else return even(n-1);

}

function even(n) {

if (n == 0) return true;

else return odd(n-1);

}

even(100000)

Run Stop

6

CONTINUATIONS FOR JAVASCRIPT

SAVING THE STACK AT RUNTIME

Stopfunction odd(n) {

if (n == 0) return false;

else return even(n-1);

}

function even(n) {

if (n == 0) return true;

else return odd(n-1);

}

even(100000)

Run Stop

Run

EVENT QUEUE

6

CONTINUATIONS FOR JAVASCRIPT

SAVING THE STACK AT RUNTIME

Stopfunction odd(n) {

if (n == 0) return false;

else return even(n-1);

}

function even(n) {

if (n == 0) return true;

else return odd(n-1);

}

even(100000)

Run

even

even

odd

Stop

Run

EVENT QUEUE

6

CONTINUATIONS FOR JAVASCRIPT

SAVING THE STACK AT RUNTIME

Stopfunction odd(n) {

if (n == 0) return false;

else return even(n-1);

}

function even(n) {

if (n == 0) return true;

else return odd(n-1);

}

even(100000)

Run

even

even

odd

Stop

Run

EVENT QUEUE

6

CONTINUATIONS FOR JAVASCRIPT

SAVING THE STACK AT RUNTIME

Stopfunction odd(n) {

if (n == 0) return false;

else return even(n-1);

}

function even(n) {

if (n == 0) return true;

else return odd(n-1);

}

even(100000)

Run

Runeven

even

odd

Stop

EVENT QUEUE

7

CONTINUATIONS FOR JAVASCRIPT

SAVING THE STACK AT RUNTIME

Stopfunction odd(n) {

if (n == 0) return false;

else return even(n-1);

}

function even(n) {

if (n == 0) return true;

else return odd(n-1);

}

even(100000)

Run

Runeven

even

odd

Stop

Stop

EVENT QUEUE

7

Run

CONTINUATIONS FOR JAVASCRIPT

SAVING THE STACK AT RUNTIME

Stopfunction odd(n) {

if (n == 0) return false;

else return even(n-1);

}

function even(n) {

if (n == 0) return true;

else return odd(n-1);

}

even(100000)

Run

Runeven

even

odd

Stop

Stop

EVENT QUEUE

even

odd

7

Run

CONTINUATIONS FOR JAVASCRIPT

SAVING THE STACK AT RUNTIME

Stopfunction odd(n) {

if (n == 0) return false;

else return even(n-1);

}

function even(n) {

if (n == 0) return true;

else return odd(n-1);

}

even(100000)

Stop

Stop

EVENT QUEUE

Runeven

even

odd

even

odd

8

Run

CONTINUATIONS FOR JAVASCRIPT

SAVING THE STACK AT RUNTIME

Stopfunction odd(n) {

if (n == 0) return false;

else return even(n-1);

}

function even(n) {

if (n == 0) return true;

else return odd(n-1);

}

even(100000)

Stop

Stop

EVENT QUEUE

Runeven

even

odd

even

oddeven

even

odd

even

odd

8

Run

CONTINUATIONS FOR JAVASCRIPT

SAVING THE STACK AT RUNTIME

Stopfunction odd(n) {

if (n == 0) return false;

else return even(n-1);

}

function even(n) {

if (n == 0) return true;

else return odd(n-1);

}

even(100000)

Stop

Stop

EVENT QUEUE

Runeven

even

odd

even

oddeven

even

odd

even

odd

8

Run

CONTINUATIONS FOR JAVASCRIPT

SAVING THE STACK AT RUNTIME

Stopfunction odd(n) {

if (n == 0) return false;

else return even(n-1);

}

function even(n) {

if (n == 0) return true;

else return odd(n-1);

}

even(100000)

Stop

EVENT QUEUE

Runeven

even

odd

even

odd

8

Run

APPLYING STOPIFY TO PYTHON 9

APPLYING STOPIFY TO PYTHON 9

PYTHON

APPLYING STOPIFY TO PYTHON 9

PYTHON

JAVASCRIPTPYJS

APPLYING STOPIFY TO PYTHON 9

PYTHON

JAVASCRIPT

JAVASCRIPT+CC

PYJS

APPLYING STOPIFY TO PYTHON 9

PYTHON

JAVASCRIPT

JAVASCRIPT+CC

STOPIFY

PYJS

APPLYING STOPIFY TO PYTHON 9

PYTHON

JAVASCRIPT

JAVASCRIPT+CC

STOPIFY

STOPPABLE JAVASCRIPT

PYJS

APPLYING STOPIFY TO PYTHON

UNFORTUNATELY, THIS IS SLOW10

0

10

20

30

anag

ramb

binary_ t re

es

deltab

lue fibnb

ody

pysto

ne

rayt ra

ce_sim

ple

richard

s

spect

ral_ norm

Benchmark

Slow

dow

n re

lati

ve t

o P

yJS

UNDERSTANDING THIS SLOWDOWN

JAVASCRIPT CALL GRAPH

11

UNDERSTANDING THIS SLOWDOWN

JAVASCRIPT CALL GRAPH

11

EVEN

ODD

UNDERSTANDING THIS SLOWDOWN

JAVASCRIPT CALL GRAPH

11

STOPIFY

EVEN

ODD

EVEN

ODD

UNDERSTANDING THIS SLOWDOWN

JAVASCRIPT CALL GRAPH

11

STOPIFY

EVEN

ODD

EVEN

ODD

EVEN

ODD

UNDERSTANDING THIS SLOWDOWN

JAVASCRIPT CALL GRAPH

11

STOPIFY

EVEN

ODD

EVEN

ODD

EVEN

ODD

12

JAVASCRIPT QUIRKS

SPOT THE INFINITE LOOP

13

JAVASCRIPT QUIRKS

SPOT THE INFINITE LOOP

13

x + 1;

JAVASCRIPT QUIRKS

SPOT THE INFINITE LOOP

13

x + 1;

const x = { toString: function() { while (true) {}

}};x + 1;

JAVASCRIPT QUIRKS

SPOT THE INFINITE LOOP

13

x + 1;

const x = { toString: function() { while (true) {}

}};x + 1;

‣ Implicit Method Calls

‣ ‘toString’ and ‘valueOf’

‣ Getters and Setters

‣ Dynamic Code Execution (eval)

SUBLANGUAGES OF JAVASCRIPT 14

JavaScript

SUBLANGUAGES OF JAVASCRIPT 14

JavaScript

toString

valueOf

eval‘arguments’ object

SUBLANGUAGES OF JAVASCRIPT

COMPILERS USE RESTRICTED SUB-LANGUAGES

14

JavaScript

toString

valueOf

eval‘arguments’ object

SUBLANGUAGES OF JAVASCRIPT

COMPILERS USE RESTRICTED SUB-LANGUAGES

14

JavaScript

toString

valueOf

eval‘arguments’ object

OCaml

SUBLANGUAGES OF JAVASCRIPT

COMPILERS USE RESTRICTED SUB-LANGUAGES

14

JavaScript

toString

valueOf

eval‘arguments’ object

OCaml

SUBLANGUAGES OF JAVASCRIPT

COMPILERS USE RESTRICTED SUB-LANGUAGES

14

JavaScript

toString

valueOf

eval‘arguments’ object

OCaml

Python

IMPROVING PERFORMANCE WITH SAFE ASSUMPTIONS15BACK TO PYTHON

0

10

20

30b

bina

ry_t

rees

delta

blue fib float

nbod

ypy

stone

richa

rds

scim

ark−

fftsp

ectra

l_no

rmBenchmark

Slow

dow

nImplicit method callsNo implicit method calls

IMPROVING PERFORMANCE WITH SAFE ASSUMPTIONS15BACK TO PYTHON

0

10

20

30b

bina

ry_t

rees

delta

blue fib float

nbod

ypy

stone

richa

rds

scim

ark−

fftsp

ectra

l_no

rmBenchmark

Slow

dow

nImplicit method callsNo implicit method calls

Median Slowdown

1.7x

EVALUATION

OPTIMIZATIONS

16

EVALUATION

OPTIMIZATIONS

16

Pyth

on

C++

OCa

ml

Java

Scala

Cloj

ure

LANGUAGE

EVALUATION

OPTIMIZATIONS

16

Pyth

on

C++

OCa

ml

Java

Scala

Cloj

ure

LANGUAGE

Chrome

Firefox

Safari

Microsoft Edge

ChromeOS

PLATFORM

EVALUATION

OPTIMIZATIONS

16

Pyth

on

C++

OCa

ml

Java

Scala

Cloj

ure

LANGUAGE

Chrome

Firefox

Safari

Microsoft Edge

ChromeOS

PLATFORM

Implicit Functions

‘arguments’

Stack Representation

…IMPLEMENTATION

EVALUATION 17

● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 50 100 150

Slowdown

% o

f tria

ls

●Chrome (11.6)ChromeBook (10.8)Edge (30.5)Firefox (11.0)Safari (8.4)

C++ (Emscripten)

●●

● ●

●●

● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 10 20 30 40 50

Slowdown

% o

f tria

ls

●Chrome (9.1)ChromeBook (11.2)Edge (13.2)Firefox (17.7)Safari (5.4)

Clojure (ClojureScript)

● ● ● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 10 20 30 40

Slowdown

% o

f tria

ls

●Chrome (3.0)ChromeBook (5.0)Edge (7.0)Firefox (3.4)Safari (1.7)

Dart (dart2js)

●● ● ● ● ● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 20 40 60

Slowdown

% o

f tria

ls

●Chrome (8.1)ChromeBook (6.0)Edge (20.9)Firefox (9.2)Safari (6.3)

Java (JSweet)

●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 200 400

Slowdown

% o

f tria

ls

●Chrome (20.0)ChromeBook (14.6)Edge (37.2)Firefox (24.8)Safari (13.7)

JavaScript

●●

● ●● ● ● ● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 20 40

Slowdown

% o

f tria

ls

●Chrome (5.4)ChromeBook (5.7)Edge (7.2)Firefox (8.9)Safari (4.2)

OCaml (BuckleScript)

● ● ● ● ● ● ● ●● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 5 10 15

Slowdown

% o

f tria

ls

●Chrome (1.7)ChromeBook (1.4)Edge (3.8)Firefox (3.4)Safari (2.0)

Python (PyJS)

●●

●● ●

●● ● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 40 80 120

Slowdown

% o

f tria

ls

●Chrome (14.6)ChromeBook (20.2)Edge (17.2)Firefox (23.9)Safari (11.8)

Scala (ScalaJS)

● ● ●

●● ●

● ● ● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 10 20 30 40

Slowdown

% o

f tria

ls●

Chrome (8.8)ChromeBook (9.0)Edge (18.2)Firefox (13.5)Safari (6.5)

Scheme (scheme2js)

EVALUATION 17

● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 50 100 150

Slowdown

% o

f tria

ls

●Chrome (11.6)ChromeBook (10.8)Edge (30.5)Firefox (11.0)Safari (8.4)

C++ (Emscripten)

●●

● ●

●●

● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 10 20 30 40 50

Slowdown

% o

f tria

ls

●Chrome (9.1)ChromeBook (11.2)Edge (13.2)Firefox (17.7)Safari (5.4)

Clojure (ClojureScript)

● ● ● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 10 20 30 40

Slowdown

% o

f tria

ls

●Chrome (3.0)ChromeBook (5.0)Edge (7.0)Firefox (3.4)Safari (1.7)

Dart (dart2js)

●● ● ● ● ● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 20 40 60

Slowdown

% o

f tria

ls

●Chrome (8.1)ChromeBook (6.0)Edge (20.9)Firefox (9.2)Safari (6.3)

Java (JSweet)

●● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 200 400

Slowdown%

of t

rials

●Chrome (20.0)ChromeBook (14.6)Edge (37.2)Firefox (24.8)Safari (13.7)

JavaScript

●●

● ●● ● ● ● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 20 40

Slowdown

% o

f tria

ls

●Chrome (5.4)ChromeBook (5.7)Edge (7.2)Firefox (8.9)Safari (4.2)

OCaml (BuckleScript)

● ● ● ● ● ● ● ●● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 5 10 15

Slowdown

% o

f tria

ls

●Chrome (1.7)ChromeBook (1.4)Edge (3.8)Firefox (3.4)Safari (2.0)

Python (PyJS)

●●

●● ●

●● ● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 40 80 120

Slowdown

% o

f tria

ls

●Chrome (14.6)ChromeBook (20.2)Edge (17.2)Firefox (23.9)Safari (11.8)

Scala (ScalaJS)

● ● ●

●● ●

● ● ● ● ● ● ● ● ● ● ●

0.00

0.25

0.50

0.75

1.00

0 10 20 30 40

Slowdown

% o

f tria

ls

●Chrome (8.8)ChromeBook (9.0)Edge (18.2)Firefox (13.5)Safari (6.5)

Scheme (scheme2js)

18STOPIFY.ORG

STOPIFYWRESTLING CONTROL FROM WEB BROWSERS

‣ Sam Baxter ‣ Rachit Nigam ‣ Arjun Guha ‣ Joe Politz ‣ Shriram Krishnamurthi

http://www.stopify.org

Recommended