Рубрики
Без рубрики

Дизайн webassembly

Patrick Ferris Дизайн Webassemblyphoto от Emile Perron на Unsplashi Love The Web. Это современная сверхдержава для распространения информации и расширений прав и возможностей человека. Конечно, у него есть свои недостатки, такие как троллинг (в значительной степени возможны через анонимность) и проблемы с конфиденциальностью, не говоря уже о проблемах

Патрик Феррис

Я люблю сеть. Это современная сверхдержава для распространения информации и расширений прав и возможностей человека. Конечно, у него есть свои недостатки, такие как троллинг (в значительной степени возможны посредством анонимности) и вопросов конфиденциальности, не говоря уже о проблемах собственности и нарушения авторских прав, вступающих в силу с высокой девственницей Статья 13 Отказ Но, давайте забудем об этом на мгновение и удивлять технологические инновации Интернета и браузеров, которые его поддерживают.

Я впервые научился кодировать в JavaScript и с тех пор был высмеивается многими для его симпатии. Да, я знаю, что есть странный Биты, как этот драгоценный камень: [] == ! []//правда Но он стал одним из самых вездесущих языков на планете благодаря Интернету, браузерам и переводчикам, которые запускают код ( V8 Google V8 и Spidermonkey Firefox назвать несколько).

Поскольку я получил больше в веб-разработке, я заметил новое имя на блоке: Webassembly. Как ученик компьютерных наук и разработчик, я считаю, что один из лучших способов узнать что-то, чтобы попытаться понять, почему инженеры, которые построили его, сделали эти выборы дизайна. Итак, вот краткий взгляд на некоторые интересные принципы дизайна в WebAssembly, а также почему я думаю, что все должны быть взволнованы.

Почему нам нужно Webassembly?

Ладно, поэтому прежде всего, всем моим любителям JavaScript там – нет, вы не беспокоитесь. Когда JavaScript впервые появился, он был разработан, чтобы он был использован легким способом, но с тех пор вышел, чтобы сделать много тяжелого подъема. Может быть, он использовался для манипулирования некоторыми элементами DOM, некоторой проверки на стороне клиента в формах, но не все, что пытается сделать в Интернете сейчас. Конечно, не бегущий полностью сброшенные игры.

Почему JavaScript не так быстро или отлично? Одной из основных причин является потому, что это интерпретированный язык. Сканирование линейки кода по линии и выполнением, к счастью, с именно вовременными компиляторами, эффективность улучшилась массово, но все же есть только столько места для улучшения. Но даже тогда есть проблема динамической печати JavaScript, вызывая другой потолок на производительности

Алекс Данило обсудил, что улучшения Windassembly могут сделать в своем Google I/O Talk В 2017 году. Что действительно принесло домой, неэффективность была его примером Добавить (а, б) Функция и сложность того, что переводчики JavaScript должны пройти, чтобы иметь смысл этого.

Webassembly открывает дверь для компиляции, что открывает другую дверь для оптимизации. Это способность принимать исходный язык C/C ++ позволяет сделать некоторую проверку статического типа, которая помогает улучшить скорость. Это то, что разработчики Mozilla Foundation понял и хотел исправить. Чтобы обобщить это Отличное видео JavaScript был разработан для людей, а браузеры были оставлены, чтобы попытаться сделать его быстро; WebAssembly был разработан в качестве целевого языка для компиляторов, которые могут быстро запустить браузеры.

Осознание того, что мы могли бы иметь два варианта бега кода в двигателях, было захватывающим перспективом – и четыре основных браузера (Chrome, Safari, Firefox и IE) все начали планы позволить своим двигателям запускать JavaScript и Webassembly. Опять же, позвольте мне подтвердить … Webassembly – это не Заменив JavaScript.

Почему скомпилированный код?

Компиляция кода действительно означает принимать его из одного (источника) языка и переводить его в другой (целевой) язык. Это невероятно упрощенное понимание компиляции. Большинство современных компиляционных трубопроводов включают еще много этапов, которые позволяют нам действительно точно настроить и оптимизировать наш код, делая его быстрее и более энергоэффективным.

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

Все проекты должны начинаться в первую очередь, и инженеры на Mozilla решили начать с их исходного языка, являющегося C/C ++ и используя существующую инструментальную инструментов, называемую LLVM (не аббревиатура) они скомпилируются, используя это.

Изначально поиск лучшего выполнения веб-сайта начался с ASM.JS (по крайней мере, в посылающем повествовании. Посмотреть PNACL – Более ранние попытки Google) небольшое подмножество JavaScript, которое может быть цель компиляции для программ C/C ++, которые использовали аннотации и другие умные трюки для улучшения производительности JavaScript.

К сожалению, ему не хватало одной важной принципы дизайна, лежащего в основе того, что было разыскивается: переносимость. Различные двигатели JavaScript давали разные отзывы о производительности, но это было четкое указание, что это может быть хорошим подходом.

Разработчики WebasseMbly решили, что их целевое представление будет бинарным форматом, который предоставил « плотное, линейное кодирование абстрактного синтаксиса » … Что это много слов, поэтому давайте распаковывать это.

«Плотная» часть относится к Цель высокого уровня достижения размера и эффективного формата времени нагрузки. Интернет все о отправке данных вдоль проводов, а в то время как есть много проектов для улучшения задержки этого, один надежный способ достижения этого – отправить меньше данных. Другим важным аспектом является повышенная скорость декодирования благодаря индексации массива по поиску словаря (если они использовали сжатый текстовый формат). Узнайте больше об этом выборе дизайна здесь Отказ

Что такое ват?

Двоичный формат, который компилирует программы C и C ++, чтобы быть .wasm Файлы, они имеют сопоставление 1: 1 прямо к (несколько) для читаемого текста человека. Эти файлы помечены .Wat это Wasmexplorer Отлично подходит для того, чтобы получить голову вокруг текстового представления и как оно относится к исходному коду. Давайте пройдем простой пример.

Здесь здесь много, так что давайте сделаем это медленно и объясним концепции, как они приходят.

Во-первых, есть эта странная модуль Слово, откуда это пришло? Mejin Lechor Отдал отличные разговоры о модулях в JavaScript и описывает их как давать код «структуру и границы». Это очень похоже на идею модулей Webassembly (и в будущем есть планы, чтобы попробовать и интегрироваться с модулями ES6).

Прямо из документов, у нас есть, что модуль – это « распределяемый, загружаемый и исполняемый блок код в Webassembly ». Модули могут иметь следующие разделы каждый со своей уникальной ответственностью: импорт, экспорт, начать, глобальную, память, данные, таблицу, элементы, функцию и код. На данный момент давайте просто посмотрим на то, что у нас есть в нашем модуле.

Первая декларация – (тип $ tire0 (func (param i32) (результат i32)))) . Это тесно связано с таблицей вызова на следующей строке. Мы объявляем новый тип с функция Подпись, которая принимает 32-битный целочисленный параметр и возвращает 32-битное целое число. Если бы мы использовали использование функции, мы снова пишем, нам придется сделать Звоните косвенно в нашу Таблица И тогда мы могли бы сделать некоторую проверку типа, чтобы убедиться, что все было правильно. В рамках минимального жизнеспособного продукта разрешена только одна таблица, но есть планы на будущее, чтобы разрешить несколько таблиц и для их проиндексирования.

Следующая декларация это (Таблица 0 AnyFunc) . Секция таблицы зарезервирована для определения нуля или более таблиц. Таблица аналогична линейной памяти в том смысле, что они являются измерительными массивами, которые содержат ссылки. 0 Вносит ссылку на то, что у нас ничего нет в нашем столе, но нам все еще нужно предоставить только возможное значение MVP anyfunc. (функция).

Проблема, которую разработчики были связаны с безопасностью. Если функция хотела вызвать другую функцию, предоставляя ему прямой доступ к функции, хранящейся в линейной памяти, небезопасна. Вместо этого функции хранятся в таблице, готовой к индексированию, если это необходимо. Лин Кларк написал отличный Статья Описывая таблицы (как используется в импорте) более подробно и как они обеспечивают лучшую безопасность.

У нас тогда есть декларация (память 1) , это линейная память, используемая модулем, и мы заявляем, что нам нужно 1 Страница Память (64kib) Отказ

Следующая декларация это (Экспорт памяти памяти) Отказ Экспорт – это то, что возвращается в хосту в эмоциональное время. По сути, прохладные биты, которые мы хотим от Webassembly Code.

Структура довольно простая (Экспорт <Имя на экспорт> (<Тип> & l t; Имя/Индекс>)) Так что здесь мы просто экспортируем память, которую мы объявили в предыдущей строке. Это обеспечивает прямой доступ к памяти в наших Javas Код крийпта, В качестве ArrayBuffer, который резко повышает эффективность, так как нет обратного и вперед, вызовов на границе WASM/JS. Точно так же мы экспортируем Наша функция с (exp ОРТ “Главная” $ func0).

Теперь на чуть более интересный бит, наш код и его представление.

Прежде чем двигаться дальше, это прекрасная возможность представить еще один компонент дизайна: стек машины.

Регистрация против стековых машин

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

Простой, но несколько недостатков, аналогия может быть кухней и сделать рецепт. Ингредиенты хранятся в разных местах, вы их получаете и делаете что-то, что вы можете поставить где-то еще на другой день или немедленно потребляют (yum). Это далеко не идеально, но, надеюсь, вы получите идею.

Стекские машины, с другой стороны, используют другую модель. Представьте, что вы являетесь журналистом или секретарем, ваша работа – читать и отвечать на письма. Вы ‘POP’ The The The The The The The The Picture из вашей кучи и начните написать ответ, пока кто-то другой приходит вместе с большей работой и «толкает» на вершину кучи. Это те, которые вы собираетесь делать дальше. Опять же, чрезвычайно упрощенно, но он должен помочь визуализировать механику.

Webassembly использует модель стека машины для выполнения кода. Если вы не хватаете большого числа, и находитесь в программировании семантики, в статье » Принесение в Интернет на скорость с Webassembly “действительно хорошо. Он также указывает, почему они выбирают представление стека машины: «Организация Stack – это просто способ достижения компактного представления программы, так как было показано, что он меньше, чем реестр машины», со ссылкой на Эта бумага который нашел «… размер Bytecode Register Machine на 26% больше, чем у соответствующего стека один».

Несмотря на то, что подход Stack Machine не обязательно быстрее, он предлагал меньший базовый код; Невероятно важный дизайн-цель для интернет-транзакций.

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

Сначала это может показаться немного странным иметь текстовый формат, если в конце он будет скомпилирован в двоичный формат для сжатия. Но в Интернете всегда имел политику просмотра источника, и поэтому разработчики за Webassembly создают текстовый формат. Чтобы пойти на шаг дальше и избегать конфликтов синтаксиса, они использовали Lisp-Alke S-выражение стиля Отказ

Безопасность и песочница

Одним из величайших источников ошибок (и подвигов) на небезопасных языках является переполнение буфера. C и C ++ почти взаимозаменяемы с этой идеей, и это один из первых аспектов, которые вы преподаете при изучении этих языков. В обмен на небольшие накладные расходы Webassembly добавляет эту сетью безопасности, обеспечивая индексируемую память фиксированного размера (хотя определенная память может быть выращена).

Местные переменные нашей функции, например $ var0 , не ссылаются на адрес, но вместо этого индексируются, обеспечивая слой безопасности. Доступ предоставляется через get_local. и set_local Команды, которые все происходят в места индекса локальных переменных.

Безопасность памяти была главным приоритетом при проектировании WebAssembly. Прямой из документации: « Линейная память – это песочница ; это не псевдоним других линейных воспоминаний, внутренние структуры данных двигателя исполнения, стек выполнения, локальные переменные или другое процессу памяти». Линь Кларк, опять же, написал отличную статью Описывая это Отказ

Основная идея сопоставима с объектом ArrayBuffer JavaScript – Resizable и Contacted. То, что мы пытаемся добиться, – это изоляция программирования для предотвращения ошибок и вредоносных кодов от распространения и повреждения данных, к которым даже не должно быть доступа.

Что может сделать WebAssembly?

Одним из основных конечных целей для WebAssembly была революционизация, что можно было с точки зрения графики в Интернете. Классические примеры – Zengarden по эпичам и Танки! .

Благодаря своему дизайну Webassembly отмечает ключевой момент в веб-разработке. В интернете в своем арсенале новый инструмент для создания удивительных опытов и обмена информацией. WebAssembly предоставляет меньшие размеры кода, более быстрое выполнение, большую безопасность и много места для расширяемости. С идеями, как Темы , однозначные данные с несколькими инструкциями ( SIMD ) Примитивы и исполнение нулевого затрата на горизонте, способности Webassembly выглядят только настроенными для расширения.

Оригинал: “https://www.freecodecamp.org/news/the-design-of-webassembly-81f1dcabaddd/”