Начало работы с WebAssembly.

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

Я полагаю, вы уже слышали о WebAssembly; насколько он производительный, легкий, безопасный и в целом многообещающий. В противном случае вы, вероятно, не читали бы этот текст прямо сейчас, не так ли? Итак, я просто пропущу всю эту чепуху и перейду сразу к более интересным вещам: например, как писать код Wasm и как на самом деле его использовать.

Васм и Ват

Wasm – это двоичный формат (файлы с расширением .wasm). Он также имеет текстовое представление под названием Wat (файлы с расширением .wat). Wat можно легко сгенерировать из двоичного формата, например, с помощью инструментов разработчика в браузере.

Хотя Wat — это текстовый формат, понятный людям, он все же довольно низкоуровневый — программирование сложных систем в Wat быстро превратилось бы в кошмар. Но не беспокойтесь, Wasm можно скомпилировать из многих языков, таких как Rust, C/C++, Go или Kotlin. Просто выберите свой любимый!

Привет, WebAssembly!

Чтобы понять самые основы, мы начнем с довольно низкого уровня. Ну, не на двоичном уровне, в конце концов, он никогда не предназначался для написания или чтения людьми. Мы создадим простую программу Hello world в Wat, текстовом формате WebAssembly.

Скопируйте и сохраните следующий код в файл (hello.wat):

(module
  (func (export "main") 
        (result i32)
    i32.const 42 
    return))

Подождите, в приведенном выше коде нет Hello! Это первая загвоздка: в WebAssembly нет значения type, которое представляло бы строки. У нас в базовой комплектации только числовые типы. На данный момент 42 года, ответ на главный вопрос жизни, вселенной и всего остального, будет служить нашей фразой привет, мир.

Для тестирования кода мы можем использовать WebAssembly Binary Toolkit. Во-первых, мы должны скомпилировать текстовый формат Wat в двоичный формат Wasm (hello.wasm):

$ wat2wasm hello.wat -o hello.wasm

Мы можем запустить его с помощью интерпретатора из того же инструментария:

$ wasm-interp --run-all-exports hello.wasm

Должен появиться следующий вывод:

main() => i32:42

Тот же код мы можем запустить и в браузере:

<html>
<body>
<script>
  WebAssembly
    .instantiateStreaming(fetch('hello.wasm'))
    .then(({instance}) =>
        console.log(instance.exports.main())
    );
</script>
</body>
</html>

Для работы Fetch API HTML-страница должна обслуживаться через HTTP(s). Такие инструменты, как dir2http, делают свое дело.

После открытия страницы в браузере мы должны увидеть ответ в консоли разработчика:

» 42

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

Дальнейшие шаги

Итак, мы написали нашу первую программу на Wasm и теперь знаем ответ на главный вопрос. Что дальше?

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

›› Смотрите всю серию в моем блоге! ‹‹