Size: a a a

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

2021 February 02

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Anon
Ля какой бенч. А почему AssemblyScript быстрей чем Emscripten ? Это аще легально ?
Потому что у нас есть кое какие свои оптимизации кроме binaryen. Кроме того у нас собственный pass pipeline отличающийся от стандартноо (используемого в emscripten)
источник

A

Anon in WebAssembly — русскоговорящее сообщество
Бохато живёте
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Anon
Ля какой бенч. А почему AssemblyScript быстрей чем Emscripten ? Это аще легально ?
Кроме того там старый emscripten основанный на LLVM5 кажеться. Лучше сравнивать с Clang версией
источник

AT

Alexander Tchitchigi... in WebAssembly — русскоговорящее сообщество
Да чего вы на Walt наезжаете — почти так же хорош, как "голый" Emscripten — отличный результат! Бесполезный, конечно, но всё равно. 😃
источник

Б

Богдан in WebAssembly — русскоговорящее сообщество
Alexander Tchitchigin
Ага, кто-то пишет. Коллективы из десятков core contributors, имеющих опыт разработки и оптимизации компиляторов в десятки лет на протяжении десятков лет. Я вот не горю желанием с ними соревноваться.
А почему собственно так сложно написать продакшн язык/компилятор и прям нужна целая команда и годы разработки? Вот тут один чел в 5 уроках пишет свой язык и вручную делает различные оптимизации и включая укладку в регистры (register renaming) и генерацию x64 бинарника. И все это без llvm и другого вспомогательного по
https://www.youtube.com/watch?v=fDKfdyDWdE4
https://www.youtube.com/watch?v=wdOpIIzxiNA
https://www.youtube.com/watch?v=NOFDr3HjuuQ
https://www.youtube.com/watch?v=bIvi6FNyiJA
https://www.youtube.com/watch?v=KNYCUJOzj5c
Понятно что он реализовал всего лишь пару-тройку базовых оптимизаций когда в llvm реализовано несколько десятков но учитывая с какой легкостью и скоростью в этих уроках реализуется одна оптимизация за другой то появляется мысль что не так уж оно сложно в итоге
источник

Б

Богдан in WebAssembly — русскоговорящее сообщество
MaxGraey
Автор walt тоже так думал, а потом появился вот этот простой бенчмарк от одного из энтузиаста walt-а который сравнивает C++/emscripten/clang, walt и AssemblyScript:
https://jtiscione.github.io/webassembly-wave/index.html

После этого walt (https://github.com/ballercat/walt) уже не развивается. Советую на него глянуть у него такая же философия и цели как у вас
Понятно что для дженерик языка можно бесконечно что-то оптимизировать и вряд ли тут можно соревноваться с гигантами вроде llvm по количеству и качеству оптимизаций. Но что если у нас вместо дженерик языка будет максимально ограниченный dsl у которого синтаксис/грамматика/семантика будет подобрана специально под легкость и эффективность дальнеших оптимизаций компилятором? Разве не получится срезать углы и упростить задачу?  В конце концов всегда же можно провести всякие оптимизации (инлайнинг, ручной loop-unrolling и т.д) вручную в коде самой программы
источник

A

Anon in WebAssembly — русскоговорящее сообщество
В Binaryen разных методов оптимизации было вроде 68 в прошлом году.
источник

AT

Alexander Tchitchigi... in WebAssembly — русскоговорящее сообщество
Богдан
А почему собственно так сложно написать продакшн язык/компилятор и прям нужна целая команда и годы разработки? Вот тут один чел в 5 уроках пишет свой язык и вручную делает различные оптимизации и включая укладку в регистры (register renaming) и генерацию x64 бинарника. И все это без llvm и другого вспомогательного по
https://www.youtube.com/watch?v=fDKfdyDWdE4
https://www.youtube.com/watch?v=wdOpIIzxiNA
https://www.youtube.com/watch?v=NOFDr3HjuuQ
https://www.youtube.com/watch?v=bIvi6FNyiJA
https://www.youtube.com/watch?v=KNYCUJOzj5c
Понятно что он реализовал всего лишь пару-тройку базовых оптимизаций когда в llvm реализовано несколько десятков но учитывая с какой легкостью и скоростью в этих уроках реализуется одна оптимизация за другой то появляется мысль что не так уж оно сложно в итоге
Я в Clang/LLVM не смотрел, но подозреваю, там больше сотни оптимизаций. 😊
А сложность оптимизаций растёт стремительно: простые оптимизации реально пишутся "на коленке" за пару часов, но после этого оказывается, что тебе нужен CFG, forward и backward dataflow analysis и ещё парочка нетривиальных алгоритмов сверху. И проще оно не становится.
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Богдан
Понятно что для дженерик языка можно бесконечно что-то оптимизировать и вряд ли тут можно соревноваться с гигантами вроде llvm по количеству и качеству оптимизаций. Но что если у нас вместо дженерик языка будет максимально ограниченный dsl у которого синтаксис/грамматика/семантика будет подобрана специально под легкость и эффективность дальнеших оптимизаций компилятором? Разве не получится срезать углы и упростить задачу?  В конце концов всегда же можно провести всякие оптимизации (инлайнинг, ручной loop-unrolling и т.д) вручную в коде самой программы
> В конце концов всегда же можно провести всякие оптимизации (инлайнинг, ручной loop-unrolling и т.д) вручную в коде самой программы

Можно. проблема в том, что такой код станет малопонятным и плохо сопровождаемым и малейшее изменение приведет к лавинообразному рефакторингу (напримр в случае с разверткой 2-х мерного цикла)
источник

AT

Alexander Tchitchigi... in WebAssembly — русскоговорящее сообщество
Богдан
А почему собственно так сложно написать продакшн язык/компилятор и прям нужна целая команда и годы разработки? Вот тут один чел в 5 уроках пишет свой язык и вручную делает различные оптимизации и включая укладку в регистры (register renaming) и генерацию x64 бинарника. И все это без llvm и другого вспомогательного по
https://www.youtube.com/watch?v=fDKfdyDWdE4
https://www.youtube.com/watch?v=wdOpIIzxiNA
https://www.youtube.com/watch?v=NOFDr3HjuuQ
https://www.youtube.com/watch?v=bIvi6FNyiJA
https://www.youtube.com/watch?v=KNYCUJOzj5c
Понятно что он реализовал всего лишь пару-тройку базовых оптимизаций когда в llvm реализовано несколько десятков но учитывая с какой легкостью и скоростью в этих уроках реализуется одна оптимизация за другой то появляется мысль что не так уж оно сложно в итоге
А на YouTube лучше видео Jonathan Blow посмотрите — там хотя бы не учебный компилятор, но и пилит он его уже сильно не первый год.
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Alexander Tchitchigin
А на YouTube лучше видео Jonathan Blow посмотрите — там хотя бы не учебный компилятор, но и пилит он его уже сильно не первый год.
По-моему 5 лет уже пилит. И до сих пор кстати LLVM не прикрутил. Сейчас решил вместо компилятора теперь книгу по компиляторам написать
источник

AT

Alexander Tchitchigi... in WebAssembly — русскоговорящее сообщество
MaxGraey
По-моему 5 лет уже пилит. И до сих пор кстати LLVM не прикрутил. Сейчас решил вместо компилятора теперь книгу по компиляторам написать
Бета-та точно есть, ещё с прошлого года, так что почти допилил. А что все так про LLVM триггерятся? Блоу же вообще не хотел его использовать. Компилятор у него полностью свой, и он порывался ещё собственный линкер написать, потому что существующие — слишком медленные.
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Alexander Tchitchigin
Бета-та точно есть, ещё с прошлого года, так что почти допилил. А что все так про LLVM триггерятся? Блоу же вообще не хотел его использовать. Компилятор у него полностью свой, и он порывался ещё собственный линкер написать, потому что существующие — слишком медленные.
А ну, просто видел в роадмепе его. Если не планировал то ок
источник

AT

Alexander Tchitchigi... in WebAssembly — русскоговорящее сообщество
MaxGraey
А ну, просто видел в роадмепе его. Если не планировал то ок
Нет, если есть/был в роадмапе, значит, планировал так или иначе в какой-то момент. Но он прямо говорил (или писал), что LLVM его не устраивает по соображениям скорости сборки, так что в качестве основного варианта у него всегда было "всё своё" по крайней мере до линкера.
источник

Б

Богдан in WebAssembly — русскоговорящее сообщество
MaxGraey
> В конце концов всегда же можно провести всякие оптимизации (инлайнинг, ручной loop-unrolling и т.д) вручную в коде самой программы

Можно. проблема в том, что такой код станет малопонятным и плохо сопровождаемым и малейшее изменение приведет к лавинообразному рефакторингу (напримр в случае с разверткой 2-х мерного цикла)
Малопонятный и плохо сопровождаемомый код это если банально делать то что можно автоматизировать вручную. Это одна крайность. А вторая крайность - это пример какого-то дженерик языка когда компилятор должен анализировать кучу условий и делать сложный траверс по графу пытаясь понять намерения программиста чтобы провести какие-то эффективные оптимизации. А может есть что-то посередине? Может можно организовать намного более тесное общение с компилятором с помощью конструкций/синтаксиса/грамматики языка которая будет специально заточена под дальнейшие оптимизации? Чтобы не компилятор анализировал и угадывал намерения а программист явно их выражал в коде и при этом не сильно ухудшить читаемость и поддерживаемость
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Богдан
Малопонятный и плохо сопровождаемомый код это если банально делать то что можно автоматизировать вручную. Это одна крайность. А вторая крайность - это пример какого-то дженерик языка когда компилятор должен анализировать кучу условий и делать сложный траверс по графу пытаясь понять намерения программиста чтобы провести какие-то эффективные оптимизации. А может есть что-то посередине? Может можно организовать намного более тесное общение с компилятором с помощью конструкций/синтаксиса/грамматики языка которая будет специально заточена под дальнейшие оптимизации? Чтобы не компилятор анализировал и угадывал намерения а программист явно их выражал в коде и при этом не сильно ухудшить читаемость и поддерживаемость
Именно так и представлял себе Брендан Эйх JavaScript 1.0. Точно так же себе представлял Бутерин solidity. В конечном итоге все языки казалось бы спроектированные для узкой доменной области превращаются в языки с общим назначением. И я таких примеров могу назвать очень много. Да те же шейдера. Раньше они умели только математику и чтение из тектуры, даже функции power не было, потом все это появилось и даже циклы постоянной длины, потом появились циклы переменной длины и настоящие условные переходы. Теперь с compute shaders программы для GPU вообще мало чем отличаются от обычных. К этому неизбежно приходят практически все языки. Даже декларативные. Взять тот же CSS. Он неожиданно для многих уже давно turing compleate с появлением CSS3 ну а про CSS-in-JS я вообще молчу=)
источник

AT

Alexander Tchitchigi... in WebAssembly — русскоговорящее сообщество
Богдан
Малопонятный и плохо сопровождаемомый код это если банально делать то что можно автоматизировать вручную. Это одна крайность. А вторая крайность - это пример какого-то дженерик языка когда компилятор должен анализировать кучу условий и делать сложный траверс по графу пытаясь понять намерения программиста чтобы провести какие-то эффективные оптимизации. А может есть что-то посередине? Может можно организовать намного более тесное общение с компилятором с помощью конструкций/синтаксиса/грамматики языка которая будет специально заточена под дальнейшие оптимизации? Чтобы не компилятор анализировал и угадывал намерения а программист явно их выражал в коде и при этом не сильно ухудшить читаемость и поддерживаемость
> А может есть что-то посередине? Может можно организовать намного более тесное общение с компилятором с помощью конструкций/синтаксиса/грамматики языка которая будет специально заточена под дальнейшие оптимизации? Чтобы не компилятор анализировал и угадывал намерения а программист явно их выражал в коде и при этом не сильно ухудшить читаемость и поддерживаемость

Есть, только Вам не понравится. В разной степени описанию соответствуют Rust и ATS. Как ни удивительно, у обоих очень не простые компиляторы.

Фундаментальная проблема в том, что для оптимизаций нужна одна семантическая информация, а людям интересна совсем другая. Немного surprising middle ground находится в области чистых функций, контроля эффектов и линейных типов — потому что они облегчают рассуждения и людям, и компиляторам — но Вам всё равно не понравится.
источник

AT

Alexander Tchitchigi... in WebAssembly — русскоговорящее сообщество
MaxGraey
Именно так и представлял себе Брендан Эйх JavaScript 1.0. Точно так же себе представлял Бутерин solidity. В конечном итоге все языки казалось бы спроектированные для узкой доменной области превращаются в языки с общим назначением. И я таких примеров могу назвать очень много. Да те же шейдера. Раньше они умели только математику и чтение из тектуры, даже функции power не было, потом все это появилось и даже циклы постоянной длины, потом появились циклы переменной длины и настоящие условные переходы. Теперь с compute shaders программы для GPU вообще мало чем отличаются от обычных. К этому неизбежно приходят практически все языки. Даже декларативные. Взять тот же CSS. Он неожиданно для многих уже давно turing compleate с появлением CSS3 ну а про CSS-in-JS я вообще молчу=)
источник

AT

Alexander Tchitchigi... in WebAssembly — русскоговорящее сообщество
I think the observations are pretty relevant and resonant for (the future applications of) Wasm: https://www2.eecs.berkeley.edu/Pubs/TechRpts/2019/EECS-2019-3.pdf
(The paper is on challenges and prospects of "serverless computing".)
источник

A

Anon in WebAssembly — русскоговорящее сообщество
Вери вандерфул
источник