Как я могу перевести программу в текстовом формате WebAssembly (.wat) в двоичный формат в JavaScript? - PullRequest
0 голосов
/ 28 марта 2020

Я хочу сделать простую интерактивную скрипку WebAssembly в JavaScript. Учитывая, что пользователь вводит исходный код WebAssembly в текстовом формате, как я могу преобразовать его в двоичный формат, необходимый для его запуска?

Я ищу решение в браузере JavaScript.

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Binaryen - инфраструктура компилятора для WebAssembly - имеет официальный порт JavaScript / WebAssembly, который можно использовать с JavaScript, в том числе в браузере: https://www.npmjs.com/package/binaryen.

Вот как вы можете использовать его для анализа WAT, создания двоичного файла и создания из него модуля:

var binaryen = require("binaryen");

// Create a module from a WebAssembly Text format
var myModule = binaryen.parseText(`(module
 (type $i32_i32_=>_i32 (func (param i32 i32) (result i32)))
 (export "add" (func $add))
 (func $add (; 0 ;) (; has Stack IR ;) (param $0 i32) (param $1 i32) (result i32)
  (i32.add
   (local.get $0)
   (local.get $1)
  )
 )
)`);

// Emit module in a binary format
var wasmData = myModule.emitBinary();

// Use WebAssembly API to instantiate a compiled module
var compiled = new WebAssembly.Module(wasmData);
var instance = new WebAssembly.Instance(compiled, {});

// And use it
console.log(instance.exports.add(41, 1));

Обратите внимание, что в этом конкретном примере используется require(...) таргетинг Node.js, но это должно быть достаточно просто перенести его в браузер, используя пакет или включив скрипт на странице, указывающей на версию Binaryen на стороне клиента, из одного из CDN с использованием ссылок в документах .

0 голосов
/ 28 марта 2020

У вас есть 2 возможных варианта:

  • Go традиционный маршрут - создайте приложение на стороне сервера, которое принимает WAT, выполняет перевод, а затем возвращает значение в виде строки. Так и переводят другие сайты «веб-консоли» (groovy, ruby, java и т. Д. 1018 * ..)
  • Маршрут веб-сборки - создайте модуль веб-сборки (вспомогательный - SOP и все такое), который выполняет перевод из WAT в JS, включите его и сделайте ссылку на него так же, как и любой другой модуль веб-сборки

Стоит отметить, что в любом случае это потенциально опасные операции. Так что наступи слегка

...