C++JS = ?

Valeriy Kuzmin

Lilt, 2019

Games

Video/audio processing

IDE

Virtualization

VR

Data visualisation

Recognition

Language interpreters

Cryptography

Asm.js

Code example

function module() {
  "use asm"; // begin asm.js
 
  function fib(n) {
    n = n|0; // type annotation, int n
    var a = 0, b = 1, t = 0; 
    while( (n|0) >= 0) {
        t = b;
        b = a + b|0; // expression type annotation (int) (a + b)
        a = t;
        n = n - 1|0;
    }
    return b|0; // result type annotation int fib
  }
 
  return { fib: fib }; // export
}


module().fib(5); // 8th number, 13

- "Low-level" subset of JavaScript

- Primarily linear work with memory (no objects usage!)

- Typed

Features

- Can be optimized well

- Compilation target for C/C++/Rust

Demo: UT3 in Firefox

Browser support 15.07.2019

- Single error means de-optimizing into JS

- Huge source size, hard to parse

- Hard to extend because it's JS-based

What is bad about asm.js

WebAssembly

WebAssembly is...

- W3C - developed specification

- Text and binary format of source code

- Compilation target for С/С++/Rust/Kotlin/more

- Safe and portable

Basically, a shortcut to JS optimizations

WebAssembly is not...

- JS replacement

- A language of itself, at least writable one

- Compilations target for TypeScript, Coffescript...

- Compilation target Java, C# *

- Magic solution to optimize bad code code

Previous example: fib-asm.js

function module() {
  "use asm"; // begin asm.js
 
  function fib(n) {
    n = n|0; // type annotation, int n
    var a = 0, b = 1, t = 0; 
    while( (n|0) >= 0) {
        t = b;
        b = a + b|0; // expression type annotation, (int) (a + b)
        a = t;
        n = n - 1|0;
    }
    return b|0; // return type annotation, int fib
  }
 
  return { fib: fib }; // export
}


module().fib(5); // 8th number, 13

Example: fib.wast

(module
  (export "fib" (func $fib))
  (func $fib (param $n i32) (result i32)
    (local $a i32) (local $b i32) (local $t i32) // int a, b, t
    (loop $while-in (block $while-out // while
        (if (i32.eqz (i32.ge_s // n >= 0
            (get_local $n) 
            (i32.const 0)))
          (br $while-out))
        (block
          (set_local $t (get_local $b)) // t = b
          (set_local $b (i32.add (get_local $a) (get_local $b))) // b = a + b
          (set_local $a (get_local $t)) // a = t
          (set_local $n (i32.sub (get_local $n) (i32.const 1))) // n = n - 1
        )
        (br $while-in)
      )
    )
    (return (get_local $b)) // return b
  )
)

bin/asm2wasm --no-opts fib.asm.js

Example: fib.wasm

00000000  00 61 73 6d 0c 00 00 00  01 86 80 80 80 00 01 40  |.asm...........@|
00000010  01 01 01 01 02 c4 80 80  80 00 04 03 65 6e 76 06  |............env.|
00000020  6d 65 6d 6f 72 79 02 01  80 02 80 02 03 65 6e 76  |memory.......env|
00000030  05 74 61 62 6c 65 01 20  01 00 00 03 65 6e 76 0a  |.table. ....env.|
00000040  6d 65 6d 6f 72 79 42 61  73 65 03 01 00 03 65 6e  |memoryBase....en|
00000050  76 09 74 61 62 6c 65 42  61 73 65 03 01 00 03 82  |v.tableBase.....|
00000060  80 80 80 00 01 00 07 87  80 80 80 00 01 03 66 69  |..............fi|
00000070  62 00 00 09 81 80 80 80  00 00 0a bc 80 80 80 00  |b...............|
00000080  01 b6 80 80 80 00 01 03  01 01 01 02 00 01 00 14  |................|
00000090  00 10 00 54 5a 03 00 06  01 0f 01 00 14 02 15 03  |...TZ...........|
000000a0  14 01 14 02 40 15 02 14  03 15 01 14 00 10 01 41  |....@..........A|
000000b0  15 00 0f 06 01 0f 0f 14  02 09 0f 0f              |............|

 bin/wasm-as fib.wast | hexdump -C

188 байт

What you can do with WASM right now:

- Compile useful C libraries and use them in browser

- Use SQLLite in browser

- Render PDF with PDFium (C++ lib)

- Run LUA

- And even run Safari inside Chrome

What you cannot (yet) do

- Use SIMD without bugs

- Garbage collection integration

- Work with DOM / WebAPI without JS

- Exceptions without performance overhead

- Work with 64-bit ops and memory

Support 15.07.2019

Demo: Angry bots

Demo: hello С in browser

Tools used

- emscrippten sdk, "incoming" branch, c2f4e65c

- ubuntu 16.04, cmake, build-essentials

- binaryen, bb1c44a3

- firefox 53.02

hello.c

#include <stdio.h>

int main() {
        printf("hello, world!\n");
        return 0;
}

01-compile

02-run

The future is near

Useful stuff

  • https://www.youtube.com/watch?v=vmzz17JGPHI
  • http://webassembly.org/
  • http://asmjs.org/ 
  • https://kripken.github.io/emscripten-site/index.html
  • https://github.com/WebAssembly/binaryen

Thanks!

Questions?

malcoriel

malcoriel@gmail.com

wasm-intro-at-lilt

By Valeriy Kuzmin

wasm-intro-at-lilt

C++JS. WebAssembly tech overview for Lilt

  • 424