Введение в WebAssembly - WASM: Пособие для начинающих

Здравствуйте, будущий суперзвезда кодирования! Я рад быть вашим проводником в этом захватывающем путешествии в мир WebAssembly, или WASM для краткости. Не волнуйтесь, если вы никогда раньше не писали ни строчки кода – мы начнем с самого начала и будем продвигаться вместе. Так что налейте себе любимый напиток, устройтесь поудобнее и погружайтесь с нами!

WebAssembly - WASM

Что такое WebAssembly?

WebAssembly – это как тайный язык, который понимают веб-браузеры. Он предназначен для того, чтобы веб-приложения работали быстрее и эффективнее. Представьте, что вы пытаетесь поиграть в сложную видеоигру на веб-сайте. Без WebAssembly игра может быть медленной и неуклюжей. Но с WebAssembly она может работать плавно, почти как на игровой консоли!

Краткая история

WebAssembly появился из желания сделать веб-приложения более мощными. Впервые он был анонсирован в 2015 году, а к 2017 году его поддерживали все основные веб-браузеры. Это quite быстро в мире технологий – как быстро обновляется ваша любимая социальная сеть новыми функциями!

Модель стека

Теперь давайте поговорим о чем-то, что звучит немного технически, но на самом деле довольно просто, если его разложить по полочкам: модель стека. Это сердце того, как работает WebAssembly.

Что такое стек?

Представьте себе стопку тарелок. Вы можете добавлять или удалять тарелки только сверху стопки. В компьютерных терминах мы называем добавление в стек "push" ( pushing), а удаление из стека "pop" (popping).

Как WebAssembly использует стек

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

Давайте рассмотрим простой пример:

(module
(func $add (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
i32.add)
(export "add" (func $add))
)

Не паникуйте! Я знаю, что это выглядит как инопланетный язык, но давайте разберем это:

  1. (module): Это как saying "Вот новая кулинарная книга".
  2. (func $add ...): Мы определяем новую функцию (или рецепт) под названием "add".
  3. (param $a i32) (param $b i32): Наша функция принимает дваingredient (параметра), оба 32-битных целых чисел.
  4. (result i32): Результат также будет 32-битным целым числом.
  5. local.get $a: Положите первое число наверх нашей стопки тарелок.
  6. local.get $b: Положите второе число поверх первого.
  7. i32.add: Сложите два верхних числа и замените их результатом.

Так что, если мы вызовем эту функцию с числами 5 и 3, наш стек будет выглядеть так:

  1. Начнем с пустого стека: []
  2. После local.get $a: [5]
  3. После local.get $b: [5, 3]
  4. После i32.add: [8]

И вот! Мы сложили два числа, используя модель стека WebAssembly.

Why Use WebAssembly?

Вы можете задаться вопросом: "Это seems сложным. Почему бы не использовать JavaScript?" Отличный вопрос! У WebAssembly есть некоторые суперсилы, которые делают его особенным:

  1. Скорость: WebAssembly может работать намного быстрее, чем JavaScript для определенных задач.
  2. Эффективность: Он использует меньше памяти и процессорных ресурсов.
  3. Языковая гибкость: Вы можете писать код на языках, таких как C++ или Rust, и преобразовывать его в WebAssembly.

Представьте, что вы строите замок из песка. JavaScript – это как использовать руки – это гибко и легко начать. WebAssembly – это как иметь набор специальных инструментов – может потребоваться немного больше времени для настройки, но вы можете построить гораздо более сложные и прочные замки!

Ваш первый WebAssembly program

Давайте напишем простой программ, который складывает два числа. Мы будем использовать язык под названием WAT (WebAssembly Text Format), который является читаемой версией WebAssembly.

(module
(func $add (param $left i32) (param $right i32) (result i32)
local.get $left
local.get $right
i32.add)
(export "add" (func $add))
)

Это может показаться знакомым – это очень похоже на наш предыдущий пример! Вот что он делает:

  1. Определяет модуль (нашу программу).
  2. Создает функцию под названием $add, которая принимает два 32-битных целых числа и возвращает одно.
  3. Получает первое число ($left) и puts на stack.
  4. Получает второе число ($right) и puts его поверх первого.
  5. Складывает два числа на стеке.
  6. Экспортирует функцию, чтобы мы могли использовать ее из JavaScript.

Чтобы использовать это на веб-странице, нам нужно немного JavaScript:

fetch('add.wasm')
.then(response => response.arrayBuffer())
.then(bytes => WebAssembly.instantiate(bytes))
.then(results => {
const add = results.instance.exports.add;
console.log(add(5, 3));  // Выводит: 8
});

Этот код загружает наш WebAssembly модуль, создает экземпляр и затем вызывает нашу функцию add с числами 5 и 3.

Заключение

Поздравления! Вы только что сделали свои первые шаги в мир WebAssembly. Мы рассмотрели, что такое WebAssembly, как он использует модель стека и даже написали наш первый WebAssembly программ.

Помните, чтоучение кодирования – это как учиться новому языку или инструменту – это требует практики и терпения. Не отчаивайтесь, если все не сработает сразу. Continue experimenting, continue learning, и скоро вы будете строить потрясающие вещи с WebAssembly!

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

Credits: Image by storyset