Pull to refresh

Comments 30

Очень познавательно. Я не знал, что WASM это ФОРТ. Он строился на стеке и даже математические выражения записываются соответствующей нотацией: "2 2 + ." выведет на экран "4".

Не каждая стеково-регистровая машина становится ФОРТом. Для этого нужна, как минимум, встроенная возможность определять новые произвольные слова. Для чего нужна уже абстракция более высокого уровня, чем простая трансляция ограниченного набора инструкций байткода. Разновидность обычного ассемблера, скорее.

Такой, по сути ассемблер, был в программируемых калькуляторах — Б3-34, МК-54 и т.п., каковые стеково-регистровыми машинами и являлись, собственно (даже в режиме ручных вычислений).

А ассемблером их язык можно назвать, поскольку имеем тот же принцип — мнемоники для машинных кодов. Другое дело, что вводились коды не поцифрово, а нажатием кнопок с мнемониками — но в памяять при этом вносился и появлялся на экране шестнадцатеричный машкод команд и операндов (получался такой аппаратный транслятор), и его можно было «дизассемблировать». Ну и еще сам алфавит мнемоник не существовал в машинном представлении.
По ссылке доказывающей, что WA это не очередная JVM встретил утверждение, что WA исполняется почти также быстро как машинный код. Снижение производительности в 2 раза назвать незначительным довольно трудно. С такими источниками информации всю статью можно не глядя отправлять в корзину. Производительность .NET всего в 1,5 раза ниже чистого Си. Ничего удивительного в том, что облачные хостинги пытаются продать WA, ведь они торгуют временем работы на своём железе. Чем дольше работает код, тем лучше.
Так же хотелось бы увидеть доказательство того как разные JVM исполняют один и тот же код по разному. Естественно, что речь не идёт про функции устройств, которые не входят в стандарт Java. Если Вы будете использовать в WA функции доступные только браузеру, то никакое WASI не спасёт вас от различающегося поведения кода. Не сможет консолька рисовать canvas, а браузер не сможет получить доступ к raw-сокетам.

У облачных хостингов есть php и python, им незачем изобретать такой велосипед.

Они бы и рады заставить всех использовать только python, но их ведь сразу пошлют куда подальше. А тут смотри как много надёжности и безопасности. И почти так же быстро как машинный код.

Не вводите людей в заблуждение,

WASM это обычная виртуальная машина со стеклом и памятью, она не быстрее и не медленнее остальных (Jvm, net)

Безопасность там не лучше других, эта виртуальная машина не может определять чистая функция или нет, в спецификации этого может и не быть, а то что модули зачастую предоставляют чистые функции - это точнее не заслуга wasm, а разработчика модуля

Плюс ещё скажите лучше про ограничение в 4гб оперативны, и ещё не ясно как в ней решен вопрос синхронизации поток (cpu)

Хотяв целом я рад ее появлению, но далеко не все языки включили поддержку

Ну и про jvm - тоже заблуждение, jvm вполе из коробки безопасна и ограничить доступ к ОС делается на раз

и не медленнее остальных
Весьма спорное утверждение. Ценой внешней похожести на настоящий ассемблер стало затирание информации о типах. И если JVM откомпилировав метод может быть уверена, что при вызове метода, this != null && VALID_PTR(this) && VALID_PTR(this+sizeof(myclass)) и можно не проверять данные в процессе выполнения. То в случае же WASM всё это проверять необходимо. У всё тоже самое для каждого указателя, независимо от того, как долго функция будет с ним работать. Для аппаратного ускорения таких проверок, нужно писать полноценную виртуальную машину работающую в ядре ОС. А браузерописатели к этому совсем не готовы.

Браузерописатели ко всему готовы, на V8 гугл изначально нанял чуваков с 20-30 лет опыта написания интерпретаторов и виртуальных машин. Многие разработчики JVM были сханчены.

И если JVM откомпилировав метод может быть уверена, что при вызове метода, this != null && VALID_PTR(this) && VALID_PTR(this+sizeof(myclass)) и можно не проверять данные в процессе выполнения. То в случае же WASM всё это проверять необходимо

А что мешает эти проверки провести на этапе компиляции в WASM?

Мешает то, что предвычислить результат выполнения функций, которые будут вызывать ныне компилируемую, практически невозможно. Это задача того же порядка сложности, что и оптимизация стандартного хелло-ворда с printf до нескольких машинных инструкций и одного вызова ядра. Только вместо хелло-ворда у нас обычно огромное приложение, что повышает сложность в миллионы раз.

Я не понял ваш ответ. Допустим, у меня есть программа на Rust, и компилятор мне проверил, что нигде нет null. Я эту программу компилирую в WASM. Зачем мне там теперь нужны динамические проверки?

А компилятор WASM в машинный код должен слепо доверять вашему компилятору Rust? А, чтобы компилятор WASM мог совершить те же проверки, ему во первых нужна подробная информация о типах, а во вторых уйма времени.

Зачем ему вообще что-то проверять, если вся программа работает в своей собственной линейной памяти и за ее пределы выйти не может?

В том и дело, что она выйти не может из за проверки каждого указателя по двум границам. А если убрать проверки, то легко вылезет в память процесса, который с полными привилегиями пользователя работает.

Насколько я знаю, под каждый wasm-модуль выделяется 16 Гб виртуальной памяти, 8 Гб до начала памяти модуля, и 8 Гб на саму память (guard pages). Поэтому максимальный адрес, который может быть использован в WASM 32, не выходит за данный диапазон (он рассчитывается как 0xffffffff + 0xffffffff = 0x1fffffffe), и проверка условия не требуется.

Во первых, пруф? Раньше V8 резервировал только 1Гб для возможности расширения кучи без копирования памяти, не больше. Во вторых wasm64 на подходе. И в третьих, есть тип i64.

Ну вы можете оперировать числами типа i64, но указатель имеет тип i32 (в wasm 32).

Безопасность там не лучше других, эта виртуальная машина не может определять чистая функция или нет

Чтобы написать грязную ф-ю надо из нее вызвать уже существующую грязную функцию, т.е. нужны грязные примитивы, на уровне языка или его стандартной библиотеки.

Речь не о том, что виртуальная машина определит, чистая функция или нет.
Речь о том, что wasm для внешнего мира может быть только чистой функцией и ограниченным списком внешних api
Если все api будут безопасными - разработчик может написать только чистые функции либо чистые функции, которые вызывают безопасное api.

Но согласен, в чем отличие от остальных VM, которые тоже нормально контролируют свою память и свое внешнее api - непонятно

Сплошной маркетинговый маркетинг. Никогда общее решение не будет быстрее специализированного решения, особенно сейчас когда уже производительность на ядро уперлось в потолок и мы видим увеличение длинны векторных инструкций появления специализированных вычислителей под разные особенности вычислительных конвейеров (gpgpu, ai accelerator, datapath accelerator ...)

Этот ваш WA это очередная тупиковая ветвь развития (по производительности быстрее java и собратьев не будет ни конда). WA нужен только что бы фортрановские коды не переписывать на javascript ибо не каждый осилит (очень дорого), а полезного много.
Что код был быстрым приходится учитывать особенности железа (особенности векторизации, кэши, количество каналов памяти, длину конвейера спекулятивного исполнения и топологию процессоров). Как это всё учитывается в WA?

Более того почти всегда используются уже готовые высоко оптимизированные библиотеки для типовых вычислений которые постановляют производители железа (intel, nvidia, amd ...) и самому не заморачиваться, а тут ничего нет только выход в javascript (который это может скормить часть вычислений в ускоритель через webgl и т.о. не факт)

И еще это минимализм может привести к тому что, когда вы компануя разные модули можете заметить десяток разных вариантов реализации одного и того же функционала, у каждого модуля но по разному. Например у каждого модуля будет своя особенная библиотека для работы с векторами и матрицами. В результате чего размер итогового файла будет расти как на дрожжах.
Никогда общее решение не будет быстрее специализированного решения, особенно сейчас когда уже производительность на ядро уперлось в потолок и мы видим увеличение длинны векторных инструкций появления специализированных вычислителей под разные особенности вычислительных конвейеров

Вы не хотите покритиковать всю архитектуру x86? Это не повод от нее отказываться.
Лучше васм чем его отсутствие.

Этот ваш WA это очередная тупиковая ветвь развития (по производительности быстрее java и собратьев не будет ни конда).

эволюционная ветвь, уже 5 лет и пока все мысли о развитии. Не похоже на тупик в ближайшей перспективе.

Поживем увидим конечно, но на данный момент как и говорится нам остается только ждать чуда описанного в посте, т.к пока что он остается "ЯП низкого уровня" но не менее полезным чем его конкуренты, он переносимый как на Web Так и на такие языки как C++, C#. Да и лет не особо много прошло с момента его появления и утверждать что скоро он станет повсеместно используемым это как тыкать пальцем в небо.

Большинство из нас слышали мантру «Напиши раз, развертывай везде», которую популяризовали сторонники байткода Java, но Wasm не является просто разновидностью JVM или .NET CLR.

Во-первых, байткод Java по факту не портативен, и разные JVM могут выполнять его совершенно по-своему, исключая возможность переноса. Фреймворк .NET тоже заявляет о портативности, хотя и JVM, и .NET CLR, на мой взгляд, слишком перегружены инструкциями, чтобы уверенно обеспечивать такую возможность. При этом многие из их инструкций буквально нарушают необходимые для портативности условия. К примеру, и JVM, и .NET предоставляют доступ к операционной системе, что уже создает проблемы с переносом, а также вносит риски для безопасности, о чем я расскажу ниже.

Про то, что «JVM могут выполнять по разному» — это ложь, до тех пор, пока автор не предоставит доказательств обратного. Я по памяти могу вспомнить только пример, где Оракловская JVM корректно работает с виндоусовским керберосом, а опенсорсная — нет, но сомневаюсь что такое будет проблемой для большинства пользователей.

Вообще, смешно — убили java applet'ы в браузере, вырезали JVM-ку, «потому что ненадёжно!», что бы в итоге к тому же самому и вернуться. Ах, да! Сейчас она не перегружена инструкциями и не даёт доступ к системе. Потом, внезапно, окажется что существующих команд недостаточно, начнут добавлять, выкатят масштабное дополнение для более прямого доступа к системным ресурсам, а в итоге, внезапно, окажется, что у нас очередной комбайн, изучать который молодые программисты не захотят и от которого надо будет избавляться. Задолбало…

Чушь пишите, хвала всем богам что джава аплеты убраны. Это сквозное вирусное дерьмо было основной дверью в систему.

У васма совсем другая архитектура. Он даже вызывать себя не умеет без js.

WebAssembly был содан для того что бы покончить с монополией богомерзкого JavaScript в баузерах. И дать возможность писать высоко оптимизированный код на нормальных языках програмирования.

UFO just landed and posted this here

Почитайте mdn, не выдавайте свои мысли за описание технологии.

WebAssembly – это ни web, ни assembly
При изучении WebAssembly (кратко именуемого Wasm)…
Но, Wasm это же такой ассемблер. Т.е. WebAssembly это ни web, ни assembly, ни Wasm. Хотя конечно Wasm уже умер и можно переиспользовать имя, но создается ощущение
pythonscript
image
Sign up to leave a comment.