Size: a a a

WebAssembly — русскоговорящее сообщество

2020 August 06

M

MaxGraey in WebAssembly — русскоговорящее сообщество
cevek
а почему binaryen не имеет компиляции в wasm? в смысле сам компилятор чтобы был в васме, будет ведь явно быстрее комплиляция в браузере чем результат от ecmscripten
В смысле? Почему не встроить binaryen в браузер? Ну потому что это отдельный тулкит и кодогенератор.
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Кроме того брауры делают некоторую peephole пред-оптимизацию, но она намного проще чем у бинариана
источник

c

cevek in WebAssembly — русскоговорящее сообщество
MaxGraey
В смысле? Почему не встроить binaryen в браузер? Ну потому что это отдельный тулкит и кодогенератор.
не не, я имею ввиду есть ли не скомпиленный в js binaryen а именно в васм для скорости
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
cevek
не не, я имею ввиду есть ли не скомпиленный в js binaryen а именно в васм для скорости
Да, есть
источник

c

cevek in WebAssembly — русскоговорящее сообщество
просто в плейграунде AS используется именно js версию
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Собственно это он:
https://github.com/AssemblyScript/binaryen.js/blob/master/wasm.js

только он зашит вместе с glue кодом в base64.

Мы его пока не используем. есть нюансы. Например нужно отрефакторить наш код в асинхронном стиле
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
MaxGraey
потому что binaryen обычно убирает от 15-40% кода сгенерированного LLVM даже максимальным уровнем lto и стрипнутыми секциями. Binaryen заточен оптимизировать именно стековый байткод, в то время как LLVM проводит в основном оптимизации на регистровым IR. Кроме того LLVM делает очень много вещей, которые имеют смысл для нативных целей. Binaryen это потом вынужден иправлять / оптимизировать
> Кроме того LLVM делает очень много вещей, которые имеют смысл для нативных целей. Binaryen это потом вынужден иправлять / оптимизировать

Одна из важнейших кстати вещей - это Relooper и memory pack проходы
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
cevek
не не, я имею ввиду есть ли не скомпиленный в js binaryen а именно в васм для скорости
Еще binaryn спроектирован с учетом многопоточности, так что binaryen дейстительно может работать в AS в разы быстрее чем сейчас
источник

c

cevek in WebAssembly — русскоговорящее сообщество
а на сколько быстро работает бинариен если выключить все оптимизации, чтобы видеть как можно быстрее результат исполнения во время разработки?
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Ну для AS просто убрать флаг относящийся к оптимизации или указать -O0 флаг
источник

c

cevek in WebAssembly — русскоговорящее сообщество
а ваш компилятор AS в binaryen написан на ts верно, не на AS? т е компилятор работает только на js
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Не очень понял вопрос. AS написан на TypeScript но так, что бы мог скомпилировать сам себя, то есть по-сути написан на AS. Binaryen скомпилирован в asm.js (точнее упрощенный asm.js без использования «use asm») и слинкован с AS посредством glue кода в asc.js. Но так как binaryen можно скомпилировать в wasm, а сам код компилятора написан на AS и сам себя бутстрапит (это даже делается в качестве одного из тестов в CI) то теоретически нам не обязателен тот glue код на javascript, он может быть легко переписан и на Rust или C++ и тогда компилятор можно будет запускать напримре из-под wasmtime а не из под браузера или node.js. Надеюсь понятно объяснил
источник

c

cevek in WebAssembly — русскоговорящее сообщество
MaxGraey
Не очень понял вопрос. AS написан на TypeScript но так, что бы мог скомпилировать сам себя, то есть по-сути написан на AS. Binaryen скомпилирован в asm.js (точнее упрощенный asm.js без использования «use asm») и слинкован с AS посредством glue кода в asc.js. Но так как binaryen можно скомпилировать в wasm, а сам код компилятора написан на AS и сам себя бутстрапит (это даже делается в качестве одного из тестов в CI) то теоретически нам не обязателен тот glue код на javascript, он может быть легко переписан и на Rust или C++ и тогда компилятор можно будет запускать напримре из-под wasmtime а не из под браузера или node.js. Надеюсь понятно объяснил
спасибо!
источник

c

cevek in WebAssembly — русскоговорящее сообщество
а вообще насколько выше по абстракции Binaryen IR над webasm? доки очень мало, и вот пока не понимаю что проще сгенерить BIR или сразу в вебасм гнать
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
cevek
а вообще насколько выше по абстракции Binaryen IR над webasm? доки очень мало, и вот пока не понимаю что проще сгенерить BIR или сразу в вебасм гнать
Довольно высоко, так как есть работа с CFG. И еще в binaryen несколько IR - SSA, Stack IR и еще какой, то, не помню названия, кроме того он умеет понимать Souper IR и так же генерировать его. Хотя насчет понимать не уверен
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Но с точки зрения внешнего API это все выглядит как единый IR, разве что Relooper стоит немного в стороне
источник

PP

Petr Penzin in WebAssembly — русскоговорящее сообщество
MaxGraey
потому что binaryen обычно убирает от 15-40% кода сгенерированного LLVM даже максимальным уровнем lto и стрипнутыми секциями. Binaryen заточен оптимизировать именно стековый байткод, в то время как LLVM проводит в основном оптимизации на регистровым IR. Кроме того LLVM делает очень много вещей, которые имеют смысл для нативных целей. Binaryen это потом вынужден иправлять / оптимизировать
Что конкретно убирает binaryen? Есть какие-нибудь примеры?
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Petr Penzin
Что конкретно убирает binaryen? Есть какие-нибудь примеры?
Есть доклад от Алона. Даже нескоьлко. Binaryen не просто убирает мертвый код, он полностью перепесывает и оптимизирует байткод начиная от CFG и заканчиная оптимизацией локальных переменных, глобальных переменных, инлайнинга, DAE, CSE и т д. По сути почти тоже самое что и LLVM только на стековой IR + еще много специфичного. Кроме того упаковывает память, таблицы, удаляет неиспользованные импорты, секции и т д
источник

PP

Petr Penzin in WebAssembly — русскоговорящее сообщество
Я нашёл compiling webaassembly with binaryen, но он 2016 года, с тех пор очень много изменилось
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Petr Penzin
Я нашёл compiling webaassembly with binaryen, но он 2016 года, с тех пор очень много изменилось
источник