Полина Гуртовая - Wasm 101
ฝัง
- เผยแพร่เมื่อ 22 ก.ย. 2024
- Полина Гуртовая на митапе Tver.io JavaScript Meetup 19 марта 2020.
Совсем не хардкорное введение в WebAssembly.
Напишем немного кода для стековой виртуальной машины, заглянем под капот v8.
И, чтобы нам точно было не скучно, добавим немного C++ и Rust.
Ссылка на материалы: github.com/Hel...
Какой же поток. Не знаю для кого пишу, но всё же.
36:00 - ну подумаешь какие-то 64 битные инты. Кому они нужны. Мы ведь на жабаскрипте написать можем, конечно. И совсем asm.js не потому по жопе пошёл, что не смоглось никак в жабаскрипт добавить нативные типы. Потому как код должен точно так же и исполняться и как жаваскрипт. Поэтому мы, конечно же, добавить 64 битный инт можем, но тогда семантика программ в разных средах изменится, что поломает asm.js. И вот из-за таких ограничений asm.js и сдох.
37:00 - какая ещё, нахрен, асинхронность в васме? Никакой асинхронности не существует и никакой поддержки для неё не нужно.
Девушка верит в то, что говорит. Это нормально.
>Бинарный формат, виртуальная машина
Это полная чушь. В реальном мире всё бинарное. И никакая виртуальная машина ничего не означает. Существует множество vm с разными свойствами и большинство из них вообще не обладают свойствами васма.
Определение ничего не определяет.
>можно запихнуть память
Везде и всюду нужно засовывать память. Никакого отношения к "жаваскриптовому" массиву не имеет и никакой типизацией не обладает. Это так даже на уровне самого жаваскрипта, где "массивы" просто вьюшки для памяти(буферов).
>есть параметры, есть только чиселки. Строго типизированы
Поздравляю, как и в любом другом статическом языке. Потому как в железяке ничего, кроме чиселок, нет.
>объекты первого рода
Никаких родов в реальности не существует.
>бинарное не очень хорошо читается. Вот показано бинарное
Это не бинарное. Это hex-мусор. Это такое же текстовое представление бинарных данных, причём произвольных.
Люди как раз таки очень хорошо читают бинарные данные. Ну которые знакомы с программированием. И именно потому, что бинари в виде hex-дристни никто не представляет. И опять же, о чудо, текстовое преставление - это так же представление бинарных данных. Как и то, что слева.
>Эти скобочки
Эти скобочки ничего не значат. Служат не только они - это просто самая примитивная форма. И это ничего не значит. Любая программа - это дерево. Конечно, языки чуть сложнее табуретки уже в дерево не влезают и дерево это крайне примитивная и ущербная структура для представления, но всё же. На то оно и ast.
>был ast
Поздравляю, как и всё остальное. Любой язык так же имеет ast-представление.
>со временем превратилась
Никуда она не превращалась. Это превращение услышанное где-то - это просто asm.js, который кодировал ~тоже самое, но внутри жаваскрипта.
Опять это очередная раст-пропаганда убогая. Зачем брать методички с помойки?
>wasm легко парсить
Открою ещё большую тайну - его вообще парсить ненужно.
>легко разобрать
Это свойство любых правильных бинарных данных. Их легко разобрать. А использование текста - это просто следствие того, что в область формировалась изначально для домохозяек.
>выигрываете с текстом, лёгкий
Любой бинарный формат лёгкий. И выигрывать он может сколько угодно раз. И никакая "лёгкость" вообще ничего не значит.
>оно миниатюрно
Что угодно обладает этими же свойствами.
>wasm исполняется в песочнице
Т.е. мы дошли до основной фишки спустя 10 минут. При этом всё остальное - ничего не значит. Потому как общие свойства. Бинарных данных, байткода и т.п.
>модули из коробки - это веб
Это какая-то чушь. Никакие модули, импорты/экспорты никакого отношения к вебу не имеют.
>живёт в песочнице
Действительно. Потому как веб - это запуск недоверенного кода. И это отличает веб/wasm от ~всего остального. Потому как обычные vm создаются для запуска доверенного кода. Именно поэтому рассуждения о том, что wasm - это байткод для vm - чушь. Много чего является байткодом и много каких есть vm, но они не обладают этим свойством.
>работает быстро
Работает он как говно, конечно, потому что эта примитивная стековая дристня. А стековая и примитивная она потому, что это самое примитивное. То, что проходят за партой. Для всего остального нужно какое-то понимание и человеческий капитал, которого нет. Да и зачем это для веба.
По поводу быстро. Основные свойства - это возможности и предсказуемость, управляемость. Потому как производительность зависит исключительно от умения программиста, а язык лишь позволяет реализовать а) что он хочет. б) так как он хочет. wasm не особо что-то из этого даёт, но по крайне мере он убирает целый слой скриптухи. Было 10 глухих телефонов стало полтора.
>emscripten
>rust
Просто так, просто пропаганда вливается в уши. Никакого отношения раст к емскриптену не имеет.
>когда вы компилируете при помощи компилятора, например gcc. Вы получаете ir, а одно из них llvm
Это просто чушь. Вы действительно получаете ir, только проблема тут в следующем. Есть мир С/С++, есть компилятор для них(тот же гцц). Далее возникла проблема - адепту других языков не могут написать компилятор. К тому же в рамках gcc необходима была поддержка других недоязычков.
И вот во имя унификации и помощи убогим и отделили фронты. К С/С++ это никакого отношения не имеет.
И llvm не является подобным представлением. llvm-ir является, но к гцц он никакого отношения не имеет. Это представление самого llvm. llvm жил и живёт для clang, но совместно с этим позволяет всяким убогим получить компилятор на халяву. Чем и пользуется бездарное дерьмо типа раста.
В emscripten действительно входит asm.js бек для llvm, только к тему отношения это не имеет. emscripen вообще не про это и не имеет никакого отношения к вебу, а уж тем более к такому дерьму как раст.
emscripen был создан для эмуляции С/С++-окружения в вебе. Т.е. он в вебе эмулирует его(веба) отсутствие.
Тебя должен интересовать существующий в llvm wasm-бек/таргет. Который как раз таки никакое окружение в веб не тянет. И наличие которого раст-секта выдаёт за поддержу в расте wasm, которая никакого отношения к расту не имеет.
>есть js
Никакого js там нет. js там взялся от того, что он сам умеет генерировать биндинги. Ты не можешь собрать сишку в js, потому как js слишком немощен для этого.
>binaryen берёт и оптимизирует
Полная чушь. Это дерьмо не может что-то оптимизировать, потому как оптимизатор в llvm в сотни раз лучше и обладает куда более полным представлением о изначальном коде и имеет by-design больше возможностей для оптимизации.
Эти binaryen-оптимизации в основном для для "ручного" васма, либо васма из под какого-либо генератора, коих сейчас много.
>в emscripen используется.
Нет, то что он там используется и есть какой-то колхоз-проход - это ничего не значит. Оптимизирует там wasm именно llvm на этапе до llvm. Именно для этого и существует ir, чтобы не оптимизировать отдельно wasm/asm, а делать основную работу над одним "языком", а не для каждого отдельно.
>asm.js эффективное подмножество
Нихрена. asm.js никакого отношения к жаваскрипту не имеет. Он кодируется внутри него. Далее уже реализация должна вытащить этого asm.js что-то на подобии wasm, скомпилировать и исполнять его.
Вот wasm это тот же asm.js, только отвязанный от жаваскрипта. Ну и asm.js не только предсказуемей. "быстрее" - это прямое следствие из предсказуемости.
> 300кб
Это потому, что мануалы не читаются. emscripen не создан для твоего веба и для тебя. Он создан эмулировать окружение привычное в броузере. Все насрать сколько там будет килобайт. Но об этом я уже говорил выше.
> оптимизацию, в бандл
Никаких бандлов там нет, никакого отношения всё это не имеет к теме. Это сишные заморочки.
> это обвязка, чтобы ваш wasm-файлик заработал
Нет, это опять же - полная чушь. emscripen не занимается этим.
> это и даёт
Правильно, молодец. Только ты можешь ничего из этого в С/С++ не использовать. И emscripen создан прежде всего для эмуляции этого окружения и работы этих api. Запуском С/С++ в отвязки от окружения, что ты и хочешь, он не занимается. И задачи такой никогда не стояло.
> rust компилируется
Что за бездарная чушь? Никакой раст никуда не компилируется. Раст это огрызок фронта к llvm и "компилируется" он в llvm-ir. А уже этот llvm-ir компилируется, в том числе, и в раст. Всё это воровано у С/С++.
> что дальше, что нужно
Ничего из этого ненужно. Нужны исключения, нужен гц для возможности использовать ссылки на js-объекты из wasm.
симды нахрен никому не нужны - просто примитивная херня с которой все носятся непонятно зачем.
>если вы будете использовать emscripen
опять чушь. Никакой emscripen использовать ненужно - llvm умеет в wasm, а llvm существует для clang и значит в clang, очевидно, есть это таргет.
emscripen нужен для базового С/С++ окружения в броузере. Та мникому нахрен не нужен твой вебпак. И никакой недоязычок раст тебе ничего их этого не даст. Ты там будешь переписывать код под другое окружение.
Дерево у него ущербная структура)))