jerryscript · jerryscript 6lowpan demo raspberry pi 2 (1gb ram, 8gb flash) pong/tetris jerryscript...

39
1 Samsung Open Source Group JerryScript An ultra-lightweight JavaScript engine for the Internet of Things Tilmann Scheller Principal Compiler Engineer [email protected] Samsung Open Source Group Samsung Research UK OpenIoT Summit Europe 2016 Berlin, Germany, October 11 – 13, 2016

Upload: others

Post on 06-Jun-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

1Samsung Open Source Group

JerryScriptAn ultra-lightweight JavaScript engine for the Internet of Things

Tilmann SchellerPrincipal Compiler Engineer

[email protected]

Samsung Open Source GroupSamsung Research UK

OpenIoT Summit Europe 2016Berlin, Germany, October 11 – 13, 2016

Page 2: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

2Samsung Open Source Group

Overview

● Introduction

● JerryScript

● JerryScript Internals Overview

● Memory consumption/Performance

● Demo

● Future work

● Summary

Page 3: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

3Samsung Open Source Group

Introduction

Page 4: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

4Samsung Open Source Group

What is JerryScript?

● A really lightweight JavaScript engine

● Has a base footprint of ~3KB of RAM

● Optimized for microcontrollers

● Originally developed from scratch by Samsung

● JerryScript is an open source project released under the Apache License 2.0

● Actively developed on GitHub

Page 5: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

5Samsung Open Source Group

Why JavaScript on microcontrollers?

● There's a huge pool of JavaScript developers

● Opens up the possibility for web developers to easily write software for embedded devices

● Performance overhead of JavaScript less of an issue for control tasks

● Increased productivity, shorter time to market

● Ability to load code dynamically over the network

● Security: Executing JavaScript code is safer than executing arbitrary native code

Page 6: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

6Samsung Open Source Group

JerryScript

Page 7: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

7Samsung Open Source Group

JerryScript History

● Development started in June 2014

● Released as open source in June 2015

● JerryScript passed 100% of the test262 conformance test suite in August 2015

● Rewritten compact byte code implementation landed in January 2016

● JerryScript 1.0 released in September 2016

● Current focus on usability

Page 8: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

8Samsung Open Source Group

JerryScript

● Heavily optimized for a low memory footprint

● Interpreter-only

● Compact object representation

● Compressed pointers

● No AST, directly creating byte code

● Compact byte code heavily optimized for low memory consumption

Page 9: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

9Samsung Open Source Group

JerryScript Portability

● Extremely portable

● Self-contained

● Small C library

● Can run bare-metal

● Supports the STM32F4, Arduino 101, FRDM-K64F, ESP8266 (experimental) boards

● OS support: NuttX, Zephyr, mbed OS, RIOT

● Runs on Linux/macOS as well

Page 10: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

10Samsung Open Source Group

JerryScript

● Written in C99

● About 84KLOC

● Code size 156KB when compiled with GCC in LTO mode for ARM Thumb-2

● Implements the entire ECMAScript 5.1 standard, passes 100% of the test262 conformance test suite

● C API for embedding JerryScript

● Byte code snapshot feature

Page 11: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

11Samsung Open Source Group

Target hardware

● STM32F4 developer board

● Cortex-M4F clocked at 168 MHz

● 192KB of RAM

● 1MB of flash memory

Page 12: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

12Samsung Open Source Group

Target hardware

● Particle Photon board

● Cortex-M3 clocked at 120 MHz

● 128KB of RAM

● 1MB of flash memory

● Wi-Fi integrated

● Small footprint (37mm x 20mm)

Page 13: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

13Samsung Open Source Group

JerryScript C API

Page 14: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

14Samsung Open Source Group

JerryScript C API

Page 15: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

15Samsung Open Source Group

JerryScript Internals Overview

Page 16: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

16Samsung Open Source Group

High-Level Design Overview

Page 17: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

17Samsung Open Source Group

Parser Overview

● Optimized for low memory consumption

– E.g. only 41KB of memory is required to parse the 95KB ofconcatenated IoT.js source code

● 12.5KB byte code, 10KB literal references,12.2KB literal storage data, 7KB for parser temporaries

● Generates byte code directly

– No intermediate representation (e.g. AST)

● Recursive descent parser

– The parser uses a byte array for the parser stackinstead of calling functions recursively

Page 18: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

18Samsung Open Source Group

Compact Byte Code (CBC)

● CBC is a variable-length byte code

● Currently 306 opcodes are defined

– Majority of the opcodes are variants of the same operation

● E.g. “this.name” is a frequent expression in JavaScript soan opcode is defined to resolve this expression

– Usually this operation is constructed from multiple opcodes:op_load_this, op_load_name, op_resolve

– Other examples: “a.b(c,d)” or “i++”

Page 19: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

19Samsung Open Source Group

Compact Byte Code Interpreter

● The interpreter is a combination of a register and stackmachine

– The stack is used to compute temporary values

– The registers are used to store local variables

● Byte code decompression

– Byte code instructions are decoded into a maximum of three atomic instructions and those instructions are executed by the interpreter

Page 20: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

20Samsung Open Source Group

Compressed Pointers

● Compressed pointers are 16-bit values, which represent8 byte aligned addresses on the JerryScript heap

– Saves 50% of memory on 32-bit systems

● The JerryScript heap is a linear memory space with a maximum size of 512KB (equals to UINT16_MAX * 8)

– UINT16_MAX is 65535

● Pointer compression can also be turned off to enable a maximum heap size of 4GB

Page 21: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

21Samsung Open Source Group

Value Representation

● JavaScript is a dynamically typed language

– All values carry type information as well

● ECMAScript values in JerryScript are 32-bit wide

– They can be primitive values (true, null, undefined, …)or pointers to numbers, strings or objects

● On 32-bit systems, 29 bits are enough to directly storeany 8 byte aligned 32-bit pointer

Page 22: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

22Samsung Open Source Group

String Representation

● String descriptor is 8 bytes long

● Several string types are supported in JerryScript besides the usual character array

– Short strings: Stored in the 32-bit value field

– Magic (frequently used) string indices

Page 23: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

23Samsung Open Source Group

Number Representation

● Numbers are double precision values by default

● Optional mode for single precision values

– Single precision numbers do not satisfy theECMAScript requirements but can be computed faster, trading precision for performance

Page 24: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

24Samsung Open Source Group

Object Representation

● Garbage collector can visit all existing objects

● Objects have a property list

– Named data, named accessor properties

– Internal properties

● Functions are objects in JavaScript

Page 25: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

25Samsung Open Source Group

Memory consumption/Performance

Page 26: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

26Samsung Open Source Group

SunSpider 1.0.2 - Memory consumption

3d-cube

3d-raytrace

access-binary-trees

access-fannkuch

access-nbody

bitops-3bit-bits-in-byte

bitops-bits-in-byte

bitops-bitwise-and

bitops-nsieve-bits

controlflow-recursive

crypto-aes

crypto-md5

crypto-sha1

date-format-tofte

date-format-xparb

math-cordic

math-partial-sums

math-spectral-norm

string-base64

string-fasta

0 50 100 150 200 250 300 350 400

35

185

38

11

11

5

5

4

139

80

57

142

92

21

21

6

5

12

125

20

138

339

160

101

106

98

97

97

207

135

190

261

169

352

147

102

101

102

267

107

JerryScript 1.0

Duktape 1.5.1

Max RSS in KB (lower is better) Measured on a Raspberry Pi 2

Page 27: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

27Samsung Open Source Group

SunSpider 1.0.2 - Performance

3d-cube

3d-raytrace

access-binary-trees

access-fannkuch

access-nbody

bitops-3bit-bits-in-byte

bitops-bits-in-byte

bitops-bitwise-and

bitops-nsieve-bits

controlflow-recursive

crypto-aes

crypto-md5

crypto-sha1

date-format-tofte

date-format-xparb

math-cordic

math-partial-sums

math-spectral-norm

string-base64

string-fasta

0 1 2 3 4 5 6 7 8

0.94

1.11

0.59

2.38

1.08

0.58

0.85

1.01

1.8

0.38

1.11

0.73

0.7

0.87

0.47

1.33

0.73

0.58

2.06

1.39

1.01

1.62

1.23

2.19

1.65

1.51

1.71

7.4

2.88

1.13

1.76

1.44

1.33

3.08

1.64

2.56

2.69

0.83

4.18

4.53

JerryScript 1.0

Duktape 1.5.1

Execution time in seconds (lower is better) Measured on a Raspberry Pi 2

Page 28: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

28Samsung Open Source Group

Demo

Page 29: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

29Samsung Open Source Group

Pong Demo

● Implementation of the classic Pong game

● Display shared across two devices

● Each device drives one LED matrix

● Implemented as a Node.js module

● "AI" oppenent running on the microcontroller

Page 30: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

30Samsung Open Source Group

Pong Demo

Raspberry Pi 2(1GB RAM, 8GB Flash)

Pong ClientNode.js

V8Linux

STM32F4 board(192KB RAM, 1MB Flash)

Pong ServerIoT.js

JerryScriptNuttX

Ethernet

USB Keypad

LED Matrix LED Matrix

I2C I2C

Page 31: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

31Samsung Open Source Group

Pong Demo

Page 32: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

32Samsung Open Source Group

JerryScript 6LoWPAN Demo

● Multiplayer implementation of the classic Pong/Tetris game

● Each device drives one LED matrix as display

● Game implemented in JavaScript

● Running on Photon boards

● Low-power wireless communication via 6LoWPAN

Page 33: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

33Samsung Open Source Group

JerryScript 6LoWPAN Demo

Raspberry Pi 2(1GB RAM, 8GB Flash)

Pong/TetrisJerryScript

Linux

Particle Photon(128KB RAM, 1MB Flash)

Pong/TetrisJerryScript

RIOT

USB Keypad

LED Matrix LED Matrix

I2C I2C

Switches via GPIO

6LoWPAN

Live demo will be shownduring ELCE Technical Showcase!

Wednesday, 5:20 PM - 7:00 PM

Page 34: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

34Samsung Open Source Group

Future work

Page 35: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

35Samsung Open Source Group

Future work

● Further performance and memory optimizations

● Debugging support

● Memory profiling

● Selected ES6 features

● Support for more boards

Page 36: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

36Samsung Open Source Group

Summary

Page 37: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

37Samsung Open Source Group

Summary

● Significantly lowers barrier of entry for JavaScript development targeting heavily constrained embedded devices

● Speeds up development

● Active community

● More information on http://jerryscript.net

● Looking for bug reports and feedback

Page 38: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

Thank you.

38Samsung Open Source Group

Page 39: JerryScript · JerryScript 6LoWPAN Demo Raspberry Pi 2 (1GB RAM, 8GB Flash) Pong/Tetris JerryScript Linux Particle Photon (128KB RAM, 1MB Flash) Pong/Tetris JerryScript RIOT USB Keypad

39Samsung Open Source Group

Contact Information:

Tilmann [email protected]

Samsung Open Source GroupSamsung Research UK