Как вызвать уже существующий код WebAssembly из Emscripten

#javascript #c #webassembly #emscripten

#javascript #c #webassembly #emscripten

Вопрос:

Я создал компилятор на своем языке программирования (называемый AEC), предназначенный для WebAssembly. Однако этот компилятор создает только совместимый с WebAssembly Binary Toolkit (WABT) код, поскольку я не смог найти достаточной документации для сборки, совместимой с Emscripten. Итак, как я могу вызвать функции на этом языке из Emscripten-совместимого C или C ?
Ранее я создавал компилятор для этого языка, ориентированный на x86, и было довольно просто использовать C для взаимодействия с кодом, написанным на этом языке. Однако то же самое, похоже, неверно при использовании WebAssembly.
Допустим, у меня есть этот код в AEC:

 Function plusOne(Integer32 integer) Which Returns Integer32 Does
    Return integer   1;
EndFunction
  

Я компилирую его следующим образом:

 [teo.samarzija@teos-acer-laptop debug]$ ../AECforWebAssembly/aec *.aec
Running the tests...
All the tests passed.
Reading the file...
All characters read!
Tokenizing the program...
Finished tokenizing the program!
Parsing the program...
Finished parsing the program!
Compiling the program...
Compilation finished!
Saving the assembly in file "plusOne.wat"...
Assembly successfully saved, quitting now.
[teo.samarzija@teos-acer-laptop debug]$ wat2wasm plusOne.wat
  

Теперь, допустим, я хочу вызвать его из кода C, такого как этот:

 #include <stdio.h>

extern int plusOne(int);

int main() {
    printf("plusOne(4)=%dn",plusOne(4));
    return 0;
}
  

Как мне скомпилировать программу на C, чтобы иметь возможность это делать? Если я попробую это аналогичным образом, я мог бы сделать это с моим компилятором AEC, ориентированным на сборку x86, я получаю эту ошибку:

 [teo.samarzija@teos-acer-laptop debug]$ emcc -o test.html test.c plusOne.wasm
emcc: error: plusOne.wasm: Input file has an unknown suffix, don't know what to do with it!
  

Итак, что мне следует делать?
Следующий код NodeJS выполняет то, что я хочу:

 const FileSystem = require('fs');
const wasmFileContent = FileSystem.readFileSync("plusOne.wasm");
let stack_pointer = new WebAssembly.Global({value : 'i32', mutable : true}, 0);
let memory = new WebAssembly.Memory({initial : 1, maximum : 1});
let importObject = {
  JavaScript : {stack_pointer : stack_pointer, memory : memory}
};
WebAssembly.instantiate(wasmFileContent, importObject).then((results) => {
  const exports = results.instance.exports;
  let plusOne = exports.plusOne;
  console.log("plusOne(4)=", plusOne(4));
});
  

Итак, как я могу сделать это на C или C , используя Emscripten?

Комментарии:

1. Будет ли достаточно поместить код ссылки в ваш исходный код C / C , используя EM_JS или EM_ASM? Я не уверен, что вы можете сделать это непосредственно из Emscripten