C++JS = ?

По следам FullstackFest: WebAssembly

Валерий Кузьмин

КонфУР, 2016

Live:

malcoriel

Быстрый JS? Зачем?

Игры

Обработка видео/аудио/изображений

IDE

Виртуализация

VR

Визуализация

Распознавание

Интерпретаторы

Криптография

Asm.js

Пример кода

function module() {
  "use asm"; // начинаем asm.js
 
  function fib(n) {
    n = n|0; // аннотация, int n
    var a = 0, b = 1, t = 0; 
    while( (n|0) >= 0) {
        t = b;
        b = a + b|0; // аннотация выражения (int) (a + b)
        a = t;
        n = n - 1|0;
    }
    return b|0; // аннотация результата, int fib
  }
 
  return { fib: fib }; // экспорт
}


module().fib(5); // 8 - е число, 13

Пример кода

Пример кода

Пример кода

Пример кода

Пример кода

- "Низкоуровневое" подмножество JS

- Преимущественно линейная работа с памятью

- Типизированный

Особенности

- Хорошо оптимизируется

- Цель для компиляции C и C++

Демо: UT3 в Firefox

Поддержка

- Ошибка валидации - откат в JS

- Большой размер, тяжело парсить

- Сложно расширяем из-за основы на JS

Чем плох asm.js

WebAssembly

WebAssembly - это...

- Развиваемая W3C спецификация

- Текстовый и бинарный формат

- Цель компиляции для С, С++, Rust...

- Безопасная и портабельная платформа

WebAssembly - это...

- Развиваемая W3C спецификация

- Текстовый и бинарный формат

- Цель компиляции для С, С++, Rust...

- Безопасная и портабельная платформа

"Короткий путь к оптимизатору JS"

WebAssembly - это не...

- Замена Javascript

- Язык сам по себе

- Цель компиляции для TypeScript, Coffescript...

- Цель компиляции для Java, C# *

WebAssembly - это не...

- Замена Javascript

- Язык сам по себе

- Цель компиляции для TypeScript, Coffescript...

- Цель компиляции для Java, C# *

* Вообще неправда, уже есть компиляторы

Пример: fib-asm.js

function module() {
  "use asm"; // начинаем asm.js
 
  function fib(n) {
    n = n|0; // аннотация, int n
    var a = 0, b = 1, t = 0; 
    while( (n|0) >= 0) {
        t = b;
        b = a + b|0; // аннотация выражения (int) (a + b)
        a = t;
        n = n - 1|0;
    }
    return b|0; // аннотация результата, int fib
  }
 
  return { fib: fib }; // экспорт
}


module().fib(5); // 8 - е число, 13

Пример: 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

Пример: fib.wast

Пример: fib.wast

Пример: fib.wast

Пример: fib.wast

Пример: fib.wast

Пример: fib.wast

Пример: 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 байт

Что можно сделать на WebAssembly

уже сейчас

- Компилировать полезные библиотеки

- Делать БД на SQLite

- Преобразовывать pdf при помощи poppler

- Запускать LUA

- компилировать webkit в js? o_O

Что нельзя сделать (пока)

- Полноценные потоки, разделяемая память

- Source-mapping

- SIMD

- Взаимодействие с другими процессами, vfork

- Интеграция со сборщиками мусора

- Работа с DOM / WebAPI

- Полноценная обработка исключений (просмотр, разматывание стэка)

- 64-битная (>4GB) память, map_file, mmap...

- ...

Поддержка

Polyfill!

Демо: Angry bots

http://webassembly.org/demo/

Демо: hello С++ в браузере

Используемые инструменты

- emscrippten sdk, "incoming" branch, 3bba682cc

- ubuntu 16.04, cmake, build-essentials

- binaryen, 360b5ee6d

- firefox 49.01, javascript.options.wasm = true

Скринкаст: hello.c

Скринкаст: emcc -s BINARYEN=1

Скринкаст: открываем в браузере

Будущее рядом

Полезные материалы

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

Спасибо за внимание!

Вопросы?

Презентация:

malcoriel

wasm-at-konfur

By Valeriy Kuzmin

wasm-at-konfur

По следам FullstackFest: WebAssembly. Презентация для КонфУР, СКБ Контур, 2016

  • 1,065