Waaaaaaasm?
Валерий Кузьмин, СКБ Контур
FrontTalks, сентябрь 2017
Kontur.Recognition
Как?
Бизнес-логика на JS
Бизнес-логика на JS
OMG, тут все тормозит!
Как?
Бизнес-логика на JS
Бизнес-логика на JS
Шустрый код на C
WebAssembly - это...
- Развиваемая W3C спецификация платформы
- Работающая рядом с JS "виртуальная машина"
- Текстовый и бинарный формат
- Цель компиляции для С/С++/Rust
"asm.js на стероидах"
WebAssembly - это не...
- Не замена Javascript
- Не язык сам по себе
- Не цель компиляции для TypeScript
- Не цель компиляции для Java, C# *
* Вообще неправда, уже есть компиляторы
Применение WASM
Рендеринг PDF
Работа с изображениями
Криптография
Обработка видео
Сериализация и
десериализация xml, json
Использование готовых игровых движков
Запуск других языков
Браузер в браузере
Математика, переборы,
сортировки
Базы данных на клиенте
Работа с архивами
Machine Learning
Downsampling JPEG
На пальцах
#0f0
#f00
#770
A
B
C
D
E
E = (A + B + C + D) / 4
JPEG
Canvas
JPEG
Canvas
canvas.width
Canvas
canvas.height
ctx.toDataURL
ctx.drawImage
JPEG
RGB
JPEG
RGB
libjpeg.decode
libjpeg.encode
stb resize
Wasm
Демо
(downsample)
Original
Chrome - canvas + sq=high
FF, IE - canvas
Wasm - laczos3
А что внутри?
(и как это повторить у себя в проекте)
jpegasm (JS)
libjpeg-9a (C)
stb_resize_image (C++)
libjpegasm.js
emscripten
libjpegasm.wasm
Модули
var encode_jpeg = Module.cwrap('encode_jpeg',
'number', ['number', 'number', 'number',
...]);
int encode_jpeg(
unsigned char* rgb_buffer,
unsigned int rgb_width,
unsigned int rgb_height,
...);
C из JS (cwrap)
EMSCRIPTEN_BINDINGS() {
function("stbir_resize_uint8_generic",
optional_override(...) {
...магия с маршалингом...
}
}));
}
int stbir_resize_uint8(
const unsigned char *input_pixels ,
int input_w , int input_h , ...)
C++ из JS (embind)
#include <emscripten.h>
...
float coef = stbir__filter_info_table[filter]
.kernel((float)(out_last_pixel + 1)
+ 0.5f - out_center_of_in, scale_ratio);
EM_ASM_({console.log('coef', $0)}, coef)
...
JS из C (EM_ASM)
Резюме
- собираем emscripten
- cwrap для С, embind для С++
- optional_override для сложных типов
- EM_ASM в обратную сторону
- Забудьте про GC, .delete() руками
Вместо заключения
Демо
(игра)
Полезности
Спасибо за внимание!
Вопросы?
malcoriel@gmail.com
malcoriel
http://bit.ly/wasm-ft
wasm2-at-ft
By Valeriy Kuzmin
wasm2-at-ft
- 1,738