Тим Маринин, 2018, WSD Saint Petersburg
Говорит и показывает Тим Маринин
Программист, делаю подкаст Веб-истории.
@marinintim в твиттере, гитхабе, доткоме.
В свободное время пишу сервис на Rust: seccopy.
Новые слои поверх древнего языка (который становится лучше).
Подмножество JavaScript с кучей ограничений.
— Типы в джаваскрипте до того, как это было модно.
— Память — массив.
function avg(a, b) {
a = a|0; // 32-bit int
b = b|0;
return ((a + b) / 2)|0;
}
Можно компилировать C в JS с помощью компилятора Emscripten (основан на LLVM).
LLVM — основа для многих компиляторов, например, Clang.
Можно использовать кучу оптимизаций LLVM!
На выходе — джаваскрипт с определенными гарантиями.
Спецификация виртуальной машины, формат файлов (два: текстовый и бинарный), модель для работы с памятью.
Бинарный формат парсится быстрее, чем asm.js (читай: джаваскрипт).
(module
(func $avg (export "avg")
(param $p0 i32) (param $p1 i32) (result i32)
(i32.div_s
(i32.add (get_local $p1)
(get_local $p0))
(i32.const 2))))
00 61 73 6D 01 00 00 00 01 07 01 60 02 7F 7F 01
7F 03 02 01 00 07 07 01 03 61 76 67 00 00 0A 0C
01 0A 00 20 01 20 00 6A 41 02 6D 0B 00 1A 04 6E
61 6D 65 01 06 01 00 03 61 76 67 02 0B 01 00 02
00 02 70 30 01 02 70 31
72 байта.
Несмотря на то, что WebAssembly появился в браузере, одна из целей проекта — быть настолько универсальным форматом, чтобы можно было использовать везде.
Уже есть два проекта, которые запускают WebAssembly поверх ядра Linux.
Молодой язык программирования, в который сильно вкладывается Mozilla (в частности, на него переписывают части Firefox; Servo)
Ключевая особенность: необычная система работы с памятью.
Mix of ML and C++ for the modern age.
fn avg(a: i32, b: i32) -> i32 {
(a + b) / 2
}
Есть инициативная группа, которая разрабатывает инструменты.
Поддержка на уровне компилятора — просто указать другой target
Rust не нужен GC и у него практически нет рантайма.
Приятнее, чем C и C++ для разработки нового кода.
Сейчас в функции WebAssembly можно передавать, по сути, только числа.
Но в джаваскрипте есть доступ к памяти WebAssembly — можем вручную доставать и записывать, что нам нужно.
Тулза для взаимодействия Rust <-> JS
Автоматически генерирует код, который связывает WASM и JS.
#[wasm_bindgen]
pub fn avg(a: i32, b: i32) -> i32 {
(a + b) / 2
}
Используем из JS:
const myModule = import('./mymodule')
myModule.then(myModule => {
let num = myModule.avg(10, 20)
console.log(num) // 15
})
Сначала, конечно, нужно измерять.
Game-dev like: считаем в WASM, обновляем UI из JS.
PSPDFKit: 500 000 строк C++
Люди, разрабатывающие Ember, экспериментируют с выносом virtual DOM в WebAssembly.
WebAssembly + обёртка на JS = быстрый инструмент для нас
Сила веб-приложений не в джаваскрипте, а в доступности.
Это не означает, что джаваскрипт не нужен.
Пока только MVP: minimum viable product.
Будет Garbage Collection, взаимодействие напрямую с DOM, треды, etc.